diff --git a/cleanup b/cleanup
index 3741a66ce..8c68318a2 100644
--- a/cleanup
+++ b/cleanup
@@ -1,3 +1,4 @@
#!/bin/bash
-sudo rm -fv xmlrpc.php readme* licens* wp-content/debug.log
+#sudo rm -fv xmlrpc.php readme* licens* wp-content/debug.log
+sudo rm -fv readme* licens* wp-content/debug.log
diff --git a/wp-content/languages/plugins/health-check-sv_SE.mo b/wp-content/languages/plugins/health-check-sv_SE.mo
new file mode 100644
index 000000000..bca40da8d
Binary files /dev/null and b/wp-content/languages/plugins/health-check-sv_SE.mo differ
diff --git a/wp-content/languages/plugins/health-check-sv_SE.po b/wp-content/languages/plugins/health-check-sv_SE.po
new file mode 100644
index 000000000..4964ba72f
--- /dev/null
+++ b/wp-content/languages/plugins/health-check-sv_SE.po
@@ -0,0 +1,2095 @@
+# Translation of Plugins - Health Check & Troubleshooting - Stable (latest release) in Swedish
+# This file is distributed under the same license as the Plugins - Health Check & Troubleshooting - Stable (latest release) package.
+msgid ""
+msgstr ""
+"PO-Revision-Date: 2019-10-02 17:05:05+0000\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: GlotPress/2.4.0-alpha\n"
+"Language: sv_SE\n"
+"Project-Id-Version: Plugins - Health Check & Troubleshooting - Stable (latest release)\n"
+
+#: includes/tools/class-health-check-plugin-compatibility.php:26
+msgid "Highest supported PHP"
+msgstr "Högsta PHP-version som stöds"
+
+#: includes/tools/class-health-check-plugin-compatibility.php:25
+msgid "Minimum PHP"
+msgstr "Lägsta PHP-version"
+
+#: includes/tools/class-health-check-plugin-compatibility.php:23
+msgid "Plugin"
+msgstr "Tillägg"
+
+#. translators: %s: URL for the Site Health page.
+#: includes/class-health-check-dashboard-widget.php:62
+msgid "Visit the Site Health page to gather information on about your site.."
+msgstr "Gå till sidan för hälsokontroll av webbplats för att samla ihop information om din webbplats."
+
+#: includes/class-health-check-dashboard-widget.php:55
+msgid "No Site Health information has been gathered yet, you can do so by visiting the Site Health page, alternatively the checks will run automatically once every week."
+msgstr "Ingen information om webbplatsens hälsa har samlats in än. Du kan göra detta nu genom att gå till sidan för webbplatsens hälsokontroll. I annat fall kommer kontroller att köras automatiskt en gång i veckan."
+
+#: includes/class-health-check-dashboard-widget.php:46
+msgid "No information yet…"
+msgstr "Ingen information ännu …"
+
+#: includes/tools/class-health-check-plugin-compatibility.php:77
+msgid "Could not be determined"
+msgstr "Gick inte att avgöra"
+
+#: includes/tools/class-health-check-plugin-compatibility.php:51
+msgid "Check plugins"
+msgstr "Kontrollera tilläggen"
+
+#: includes/tools/class-health-check-plugin-compatibility.php:10
+msgid "The compatibility check will need to send requests to the WPTide project to fetch the test results for each of your plugins."
+msgstr "Kompatibilitetstestet behöver även skicka förfrågningar till projektet WPTide för att hämta testresultat för vart och ett av dina tillägg."
+
+#: includes/tools/class-health-check-plugin-compatibility.php:9
+msgid "Attempt to identify the compatibility of your plugins before upgrading PHP, note that a compatibility check may not always be accurate, and you may want to contact the plugin author to confirm that things will continue working."
+msgstr "Försök att kontrollera kompatibiliteten hos dina tillägg innan du uppgraderar PHP. Tänk på att en kompatibilitetstest inte alltid ger korrekt resultat och att du kanske behöver kontakta tilläggets författare för att kolla om det kommer att fungera även i fortsättningen."
+
+#: includes/tools/class-health-check-plugin-compatibility.php:6
+msgid "Plugin compatibility"
+msgstr "Kompatibilitet hos tillägg"
+
+#: includes/class-health-check-debug-data.php:719
+msgid "Could not retrieve server headers"
+msgstr "Det gick inte att hämta header-information från servern"
+
+#: includes/class-health-check-debug-data.php:718
+#: includes/class-health-check-debug-data.php:726
+msgid "Server headers"
+msgstr "Header-information från servern"
+
+#: includes/class-health-check-debug-data.php:618
+msgid "Unable to determine the websites server user"
+msgstr "Det gick inte att avläsa användarnamnet på webbplatsens server"
+
+#: includes/class-health-check-debug-data.php:617
+msgid "Website server user"
+msgstr "Användarnamn på webbplatsens server"
+
+#: includes/class-health-check-debug-data.php:150
+msgid "Inactive Themes"
+msgstr "Inaktiva teman"
+
+#: includes/class-health-check-debug-data.php:145
+msgid "Parent Theme"
+msgstr "Modertema"
+
+#: includes/class-health-check.php:233
+msgid "Should be improved"
+msgstr "Kan förbättras"
+
+#: includes/class-health-check.php:232
+msgid "Good"
+msgstr "Bra"
+
+#: includes/class-health-check-site-status.php:1932
+msgid "Timezone"
+msgstr "Tidszon"
+
+#. translators: %s: The name of the late cron event.
+#: includes/class-health-check-site-status.php:1499
+msgid "The scheduled event, %s, is late to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended."
+msgstr "Den schemalagda åtgärden %s är försenad. Din webbplats fungerar fortfarande, men detta kan vara en indikation på att tidsinställd publicering eller automatiska uppdateringar inte fungerar som avsett."
+
+#: includes/class-health-check-site-status.php:1493
+msgid "A scheduled event is late"
+msgstr "En schemalagd åtgärd är försenad"
+
+#: includes/class-health-check-site-status.php:1244
+msgid "Update your site timezone"
+msgstr "Uppdatera din tidszon"
+
+#: includes/class-health-check-site-status.php:1239
+msgid "Your site is not using localized timezones"
+msgstr "Din webbplats använder inte lokalt anpassade tidszoner"
+
+#: includes/class-health-check-site-status.php:1229
+msgid "Daylight Savings Time (DST) may affect the times used and shown by your site, and using an UTC offset, instead of a localized timezone, means that the site does not get automatic DST updates."
+msgstr "Sommartid (DST) kan påverka de tider som används och visas av webbplatsen. Om du använder en specifik förskjutning gentemot UTC snarare än en lokalt anpassad tidszon innebär detta att tiden inte kommer att justeras automatiskt när sommartid börjar eller slutar."
+
+#: includes/class-health-check-site-status.php:1221
+msgid "Your site uses localized timezones"
+msgstr "Din webbplats använder lokalt anpassade tidszoner"
+
+#. translators: 1: Count of issues. 2: URL for the Site Health page.
+#: includes/class-health-check-dashboard-widget.php:85
+msgid "Take a look at the %1$d items on the Site Health Check status page."
+msgstr "Studera %1$d punkt(er) på sidan Hälsostatus för webbplats."
+
+#: includes/class-health-check-dashboard-widget.php:75
+msgid "Your site scores pretty well on the Health Check, but there are still some things you can do to improve the performance and security of your website."
+msgstr "Din webbplats klarar sig riktigt bra i kontrollen av dess hälsa, men det finns ändå vissa saker du kan göra för att förbättra webbplatsens prestanda och säkerhet."
+
+#: includes/class-health-check-dashboard-widget.php:73
+msgid "Great job! Your site currently passes all site health checks."
+msgstr "Stiligt! För närvarande klarar din webbplats alla kontroller avseende webbplatsens hälsa."
+
+#: includes/class-health-check-dashboard-widget.php:71
+msgid "Your site has critical issues that should be addressed as soon as possible to improve the performance or security of your website."
+msgstr "Webbplatsen har allvarliga problem som bör åtgärdas så snart som möjligt för att förbättra webbplatsens prestanda eller säkerhet."
+
+#: includes/class-health-check.php:231
+msgid "All site health tests have finished running. There are items that should be addressed, and the results are now available on the page."
+msgstr "Alla hälsokontroller för webbplatsen har nu avslutats. Det finns saker som bör åtgärdas och resultaten är nu tillgängliga på sidan."
+
+#. translators: %s: URL to Site Health Status page
+#: pages/debug-data.php:26
+msgid "This page can show you every detail about the configuration of your WordPress website. For any improvements that could be made, see the Site Health Status page."
+msgstr "Sidan kan visa dig all information om hur din WordPress-webbplats är konfigurerad. Eventuella förbättringar som kan göras beskrivs på sidan Hälsostatus för webbplats."
+
+#: includes/class-health-check-dashboard-widget.php:48
+#: pages/site-health-header.php:29
+msgid "Results are still loading…"
+msgstr "Resultaten håller fortfarande på att laddas …"
+
+#. translators: %d: Amount of hidden themes.
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:1160
+msgid "Show %d remaining themes"
+msgstr "Visa %d återstående teman"
+
+#. translators: %d: Amount of hidden plugins.
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:1081
+msgid "Show %d remaining plugins"
+msgstr "Visa %d återstående tillägg"
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:293
+msgid "When bulk-disabling plugins, a site failure occurred. Because of this the change was automatically reverted."
+msgstr "Vid samtidig inaktivering av flera tillägg inträffade ett fel på webbplatsen. På grund av detta backades ändringen tillbaka automatiskt."
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:268
+msgid "When bulk-enabling plugins, a site failure occurred. Because of this the change was automatically reverted."
+msgstr "Vid samtidig aktivering av flera tillägg inträffade ett fel på webbplatsen. På grund av detta backades ändringen tillbaka automatiskt."
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:243
+msgid "When enabling troubleshooting on the selected plugins, a site failure occurred. Because of this the selected plugins were kept disabled while troubleshooting mode started."
+msgstr "Vid aktivering av felsökning för de valda tilläggen inträffade ett fel på webbplatsen. Av denna anledning fortsatta de valda tilläggen att vara inaktiverade när felsökningsläget startades."
+
+#. translators: %s: The module name.
+#: includes/class-health-check-site-status.php:889
+msgid "The required module, %s, is not installed, or has been disabled."
+msgstr "Den nödvändiga modulen %s är inte installerad eller är inaktiverad."
+
+#: includes/class-health-check-site-status.php:501
+msgid "Your site has 1 installed theme, and it is up to date."
+msgstr "Din webbplats har 1 tema installerat, och det är uppdaterat."
+
+#: includes/class-health-check-site-status.php:342
+msgid "Your site has 1 active plugin, and it is up to date."
+msgstr "Din webbplats har 1 aktivt tillägg, och det är uppdaterat."
+
+#: pages/phpinfo.php:15
+msgid "Extended PHP Information"
+msgstr "Utökad PHP-information"
+
+#: pages/site-health-header.php:60
+msgid "The Site Health check requires JavaScript."
+msgstr "Kontrollen av webbplatsens hälsa kräver JavaScript för att fungera."
+
+#: pages/site-health-header.php:33
+msgid "Secondary menu"
+msgstr "Sekundärmeny"
+
+#: pages/site-health-header.php:17
+msgid "Site Health"
+msgstr "Hälsokontroll för webbplatser"
+
+#: pages/debug-data.php:123
+msgid "View extended PHP information"
+msgstr "Visa utökad PHP-information"
+
+#: pages/debug-data.php:40
+msgid "Copied!"
+msgstr "Kopierat!"
+
+#: pages/debug-data.php:38
+msgid "Copy site info to clipboard"
+msgstr "Kopiera information om webbplatsen till urklipp"
+
+#: pages/debug-data.php:32
+msgid "If you want to export a handy list of all the information on this page, you can use the button below to copy it to the clipboard. You can then paste it in a text file and save it to your device, or paste it in an email exchange with a support engineer or theme/plugin developer for example."
+msgstr "Om du vill exportera en bekväm lista med all information som finns på denna sida kan du använda knapparna nedan för att kopiera texten till urklipp. Sedan kan du klistra in det i en textfil och spara på hårddisken, eller klistra in det i ett e-postmeddelande till, exempelvis, någon supportperson eller utvecklare av något tema eller tillägg."
+
+#: pages/debug-data.php:19
+msgid "Site Health Info"
+msgstr "Information om webbplatsens hälsa"
+
+#: pages/troubleshoot.php:16
+msgid "Troubleshooting mode"
+msgstr "Felsökningsläge"
+
+#: pages/site-status.php:62
+msgid "Passed tests"
+msgstr "Klarade prov"
+
+#: includes/class-health-check-dashboard-widget.php:17 pages/site-status.php:32
+msgid "Site Health Status"
+msgstr "Hälsostatus för webbplats"
+
+#: pages/site-status.php:26
+msgid "Everything is running smoothly here."
+msgstr "Här är allt som det ska."
+
+#: pages/site-status.php:22
+msgid "Great job!"
+msgstr "Stiligt!"
+
+#: includes/class-health-check-debug-data.php:1399
+msgid "Total size is not available. Some errors were encountered when determining the size of your installation."
+msgstr "Totalstorleken är inte tillgänglig. Några fel inträffade när storleken av din installation skulle kontrolleras."
+
+#: includes/class-health-check-debug-data.php:1355
+msgid "The directory size calculation has timed out. Usually caused by a very large number of sub-directories and files."
+msgstr "Beräkningen av katalogens filstorlek har tagit för lång tid. Vanligaste orsaken är ett mycket stort antal underkataloger och filer."
+
+#: includes/class-health-check-debug-data.php:1348
+msgid "The size cannot be calculated. The directory is not accessible. Usually caused by invalid permissions."
+msgstr "Det går inte att beräkna storleken. Katalogen går inte att nå. Detta beror vanligtvis på felaktiga åtkomsträttigheter."
+
+#: includes/class-health-check-debug-data.php:954
+#: includes/class-health-check-debug-data.php:1003
+msgid "Theme directory location"
+msgstr "Plats för temats filkatalog"
+
+#: includes/class-health-check-debug-data.php:950
+msgid "Theme features"
+msgstr "Temafunktioner"
+
+#: includes/class-health-check-debug-data.php:946
+msgid "None"
+msgstr "Inget"
+
+#: includes/class-health-check-debug-data.php:691
+msgid "Is SUHOSIN installed?"
+msgstr "Är SUHOSIN installerat?"
+
+#: includes/class-health-check-debug-data.php:628
+msgid "PHP version"
+msgstr "PHP-version"
+
+#: includes/class-health-check-debug-data.php:623
+msgid "Web server"
+msgstr "Webbserver"
+
+#: includes/class-health-check-debug-data.php:504
+msgid "ImageMagick version string"
+msgstr "Versionssträng för ImageMagick"
+
+#: includes/class-health-check-debug-data.php:499
+msgid "ImageMagick version number"
+msgstr "Versionsnummer för ImageMagick"
+
+#: includes/class-health-check-debug-data.php:449
+msgid "Plugins directory size"
+msgstr "Storlek på tilläggens filkatalog"
+
+#: includes/class-health-check-debug-data.php:445
+msgid "Plugins directory location"
+msgstr "Plats för tilläggens filkatalog"
+
+#: includes/class-health-check-debug-data.php:440
+msgid "Themes directory size"
+msgstr "Storlek på filkatalogen för teman"
+
+#: includes/class-health-check-debug-data.php:436
+msgid "Themes directory location"
+msgstr "Plats för filkatalogen för teman"
+
+#: includes/class-health-check-debug-data.php:431
+msgid "Uploads directory size"
+msgstr "Storlek på filkatalog för uppladdningar"
+
+#: includes/class-health-check-debug-data.php:427
+msgid "Uploads directory location"
+msgstr "Plat för filkatalog för uppladdningar"
+
+#: includes/class-health-check-debug-data.php:422
+msgid "WordPress directory size"
+msgstr "Storlek på WordPress filkatalog"
+
+#: includes/class-health-check-debug-data.php:418
+msgid "WordPress directory location"
+msgstr "Plats för WordPress filkatalog"
+
+#: includes/class-health-check-debug-data.php:414
+msgid "Loading…"
+msgstr "Laddar…"
+
+#: includes/class-health-check-debug-data.php:321
+msgid "Shows whether WordPress is able to write to the directories it needs access to."
+msgstr "Visar om WordPress kan skriva till de kataloger där skrivåtkomst behövs."
+
+#: includes/class-health-check-debug-data.php:236
+msgid "These settings alter where and how parts of WordPress are loaded."
+msgstr "Dessa inställningar förändrar var och hur vissa delar av WordPress läses in."
+
+#: includes/class-health-check-debug-data.php:127
+msgid "Directories and Sizes"
+msgstr "Filkataloger och deras storlekar"
+
+#: includes/class-health-check-debug-data.php:114
+msgctxt "comment status"
+msgid "Closed"
+msgstr "Stängt"
+
+#: includes/class-health-check-debug-data.php:114
+msgctxt "comment status"
+msgid "Open"
+msgstr "Öppet"
+
+#: includes/class-health-check-debug-data.php:99
+msgid "No permalink structure set"
+msgstr "Ingen permalänkstruktur är inställd"
+
+#: includes/class-health-check-debug-data.php:84
+msgid "User Language"
+msgstr "Användarspråk"
+
+#: includes/class-health-check-debug-data.php:80
+msgid "Site Language"
+msgstr "Webbplatsspråk"
+
+#: includes/class-health-check-site-status.php:1928
+msgid "Debugging enabled"
+msgstr "Felsökning startad"
+
+#: includes/class-health-check-site-status.php:1851
+msgid "The REST API did not behave correctly"
+msgstr "REST-API betedde sig inte korrekt"
+
+#: includes/class-health-check-site-status.php:1834
+msgid "The REST API encountered an unexpected result"
+msgstr "REST-API fick ett oväntat resultat"
+
+#. translators: 1: The HTTP response code. 2: The error message returned.
+#: includes/class-health-check-site-status.php:1825
+msgid "Error: [%1$s] %2$s"
+msgstr "Fel: [%1$s] %2$s"
+
+#: includes/class-health-check-site-status.php:1816
+msgid "The REST API encountered an error"
+msgstr "REST-API gav ett fel"
+
+#: includes/class-health-check-site-status.php:1783
+msgid "The REST API is one way WordPress, and other applications, communicate with the server. One example is the block editor screen, which relies on this to display, and save, your posts and pages."
+msgstr "REST-API är ett sätt WordPress och andra tillämpningar kommunicerar med servern. Ett exempel är sidan med blockredigeraren, som använder gränssnittet för att visa och spara dina inlägg och sidor."
+
+#. translators: 1: Name of the constant used. 2: List of hostnames whitelisted.
+#: includes/class-health-check-site-status.php:1753
+msgid "HTTP requests have been blocked by the %1$s constant, with some hosts whitelisted: %2$s."
+msgstr "HTTP-anrop har blockerats av konstanten %1$s med några vitlistade adresser: %2$s."
+
+#: includes/class-health-check-site-status.php:1747
+msgid "HTTP requests are partially blocked"
+msgstr "HTTP-förfrågningar blockeras delvis"
+
+#. translators: %s: Name of the constant used.
+#: includes/class-health-check-site-status.php:1738
+msgid "HTTP requests have been blocked by the %s constant, with no allowed hosts."
+msgstr "HTTP-anrop har blockerats av konstanten %s utan några godkända adresser."
+
+#: includes/class-health-check-site-status.php:1732
+msgid "HTTP requests are blocked"
+msgstr "HTTP-förfrågningar blockeras"
+
+#: includes/class-health-check-site-status.php:1712
+msgid "It is possible for site maintainers to block all, or some, communication to other sites and services. If set up incorrectly, this may prevent plugins and themes from working as intended."
+msgstr "Det är möjligt för dem som underhåller webbplatsen att blockera all, eller viss, kommunikation till andra webbplatser och tjänster. Om detta är felaktigt konfigurerat kan det hindra tillägg och teman från att fungera som förväntat."
+
+#: includes/class-health-check-site-status.php:1677
+msgid "Your site could not complete a loopback request"
+msgstr "Din webbplats kunde inte genomföra något återanrop"
+
+#: includes/class-health-check-site-status.php:1664
+msgid "Loopback requests are used to run scheduled events, and are also used by the built-in editors for themes and plugins to verify code stability."
+msgstr "Återanrop används för körning av schemalagda händelser, och utnyttjas även av de inbyggda redigerarna för teman och tillägg för att kontrollera stabiliteten hos kod som sparas."
+
+#: includes/class-health-check-site-status.php:1656
+msgid "Your site can perform loopback requests"
+msgstr "Din webbplats kan utföra återanrop"
+
+#: includes/class-health-check-site-status.php:1617
+msgid "Some plugin or theme updates may not work as expected"
+msgstr "Vissa uppdateringar av tillägg eller teman kanske inte fungerar som förväntat"
+
+#: includes/class-health-check-site-status.php:1609
+msgid "Plugin or theme updates are not working"
+msgstr "Uppdateringar av tillägg eller teman fungerar inte"
+
+#: includes/class-health-check-site-status.php:1594
+msgid "Plugins or themes may have their own way of handling updates, which could break or negatively impact normal updates in WordPress."
+msgstr "Tillägg eller teman kan hantera uppdateringar på ett särskilt sätt, vilket kan blockera eller negativt påverka normala uppdateringar i WordPress."
+
+#: includes/class-health-check-site-status.php:1586
+msgid "Plugin and theme updates are working"
+msgstr "Uppdateringar av tillägg och teman fungerar"
+
+#: includes/class-health-check-site-status.php:1553
+msgid "Background updates may not be working properly"
+msgstr "Uppdateringar i bakgrunden kanske inte fungerar som de ska"
+
+#: includes/class-health-check-site-status.php:1545
+msgid "Background updates are not working as expected"
+msgstr "Uppdateringar i bakgrunden fungerar inte som de ska"
+
+#: includes/class-health-check-site-status.php:1542
+#: includes/class-health-check-site-status.php:1606
+msgid "Passed"
+msgstr "Klarat"
+
+#: includes/class-health-check-site-status.php:1528
+msgid "Background updates ensure that WordPress can auto-update if a security update is released for the version you are currently using."
+msgstr "Uppdateringar i bakgrunden säkereställer att WordPress kan uppdateras automatiskt om en säkerhetsuppdatering släpps för den version du för närvarande använder."
+
+#: includes/class-health-check-site-status.php:1520
+msgid "Background updates are working"
+msgstr "Uppdateringar i bakgrunden fungerar"
+
+#: includes/class-health-check-site-status.php:1480
+msgid "A scheduled event has failed"
+msgstr "En schemalagd händelse har misslyckats"
+
+#. translators: %s: The error message returned while from the cron scheduler.
+#: includes/class-health-check-site-status.php:1473
+msgid "While trying to test your site’s scheduled events, the following error was returned: %s"
+msgstr "När vi försökte att testa schemalgda händelser på din webbplats inträffade följande fel: %s"
+
+#: includes/class-health-check-site-status.php:1467
+msgid "It was not possible to check your scheduled events"
+msgstr "Det gick inte att kontrollera dina schemalagda händelser"
+
+#: includes/class-health-check-site-status.php:1456
+msgid "Scheduled events are what periodically looks for updates to plugins, themes and WordPress itself. It is also what makes sure scheduled posts are published on time. It may also be used by various plugins to make sure that planned actions are executed."
+msgstr "Det är schemalagda händelser som regelbundet kontrollerar om det finns uppdateringar för tillägg, teman och själva WordPress. De ser också till att schemalagda inlägg publiceras när de ska. De kan också användas av olika tillägg för att se till att planerade åtgärder utförs."
+
+#: includes/class-health-check-site-status.php:1448
+msgid "Scheduled events are running"
+msgstr "Schemalagda händelser körs"
+
+#: includes/class-health-check-site-status.php:1429
+msgid "Talk to your web host about OpenSSL support for PHP."
+msgstr "Kontakta ditt webbhotell och fråga om OpenSSL-stöd för PHP."
+
+#: includes/class-health-check-site-status.php:1425
+msgid "Your site is unable to communicate securely with other services"
+msgstr "Din webbplats kan inte kommunicera säkert med andra tjänster"
+
+#: includes/class-health-check-site-status.php:1421
+msgid "Your site can communicate securely with other services"
+msgstr "Din webbplats kan kommunicera säkert med andra tjänster"
+
+#: includes/class-health-check-site-status.php:1410
+msgid "Securely communicating between servers are needed for transactions such as fetching files, conducting sales on store sites, and much more."
+msgstr "Man behöver säker kommunikation mellan servrar för olika transaktiner, såsom att hämta filer, hantera försäljning i e-butiker och många andra saker."
+
+#: includes/class-health-check-site-status.php:1387
+msgid "Your site does not use HTTPS"
+msgstr "Din webbplats använder inte HTTPS"
+
+#: includes/class-health-check-site-status.php:1381
+msgid "Update your site addresses"
+msgstr "Uppdatera adresserna till din webbplats"
+
+#: includes/class-health-check-site-status.php:1367
+msgid "Only parts of your site are using HTTPS"
+msgstr "Endast delar av din webbplats använder HTTPS"
+
+#: includes/class-health-check-site-status.php:1353
+msgid "Read more about why you should use HTTPS"
+msgstr "Läs mer om varför du bör använda HTTPS"
+
+#. translators: Documentation explaining HTTPS and why it should be used.
+#: includes/class-health-check-site-status.php:1352
+msgid "https://wordpress.org/support/article/why-should-i-use-https/"
+msgstr "https://wordpress.org/support/article/why-should-i-use-https/"
+
+#: includes/class-health-check-site-status.php:1347
+msgid "An HTTPS connection is needed for many features on the web today, it also gains the trust of your visitors by helping to protecting their online privacy."
+msgstr "HTTPS-anslutningar krävs för många funktioner på webben idag. Det stärker även förtroendet hos dina besökare genom att det hjälper till att skydda deras integritet på nätet."
+
+#: includes/class-health-check-site-status.php:1339
+msgid "Your website is using an active HTTPS connection."
+msgstr "Din webbplats använder en aktiv HTTPS-förbindelse."
+
+#. translators: 1: WP_DEBUG_DISPLAY, 2: WP_DEBUG
+#: includes/class-health-check-site-status.php:1312
+msgid "The value, %1$s, has either been enabled by %2$s or added to your configuration file. This will make errors display on the front end of your site."
+msgstr "Detta värde, %1$s, har antingen aktiverats av %2$s eller lagts in i din konfigurationsfil. Detta innebär att eventuella fel visas på webbplatsens front-end."
+
+#: includes/class-health-check-site-status.php:1304
+msgid "Your site is set to display errors to site visitors"
+msgstr "Din webbplats är inställd så att den visar information om fel till besökare"
+
+#. translators: %s: WP_DEBUG_LOG
+#: includes/class-health-check-site-status.php:1297
+msgid "The value, %s, has been added to this website’s configuration file. This means any errors on the site will be written to a file which is potentially available to normal users."
+msgstr "Detta värde – %s, har lagts till i din konfigurationsfil. Det innebär att information om alla fel kommer att skrivas till en fil som eventuellt är tillgänglig för vanliga användare."
+
+#: includes/class-health-check-site-status.php:1289
+msgid "Your site is set to log errors to a potentially public file."
+msgstr "Din webbplats är inställd så att den loggar fel till en fil som kan vara publikt åtkomlig."
+
+#: includes/class-health-check-site-status.php:1280
+msgid "Read about debugging in WordPress."
+msgstr "Läs om felavhjälpning i WordPress."
+
+#. translators: Documentation explaining debugging in WordPress.
+#: includes/class-health-check-site-status.php:1279
+msgid "https://wordpress.org/support/article/debugging-in-wordpress/"
+msgstr "https://wordpress.org/support/article/debugging-in-wordpress/"
+
+#: includes/class-health-check-site-status.php:1274
+msgid "Debug mode is often enabled to gather more details about an error or site failure, but may contain sensitive information which should not be available on a publicly available website."
+msgstr "Man startar ofta felsökningsläget för att samla in mer information om ett fel eller en webbplats som inte fungerar. Men detta kan avslöja känslig information som inte bör vara publikt tillgänglig."
+
+#: includes/class-health-check-site-status.php:1266
+msgid "Your site is not set to output debug information"
+msgstr "Din webbplats är inte inställd för att lämna ut någon felsökningsinformation"
+
+#: includes/class-health-check-site-status.php:1196
+msgid "Get help resolving this issue."
+msgstr "Be om hjälp att lösa detta problem."
+
+#. translators: Localized Support reference.
+#: includes/class-health-check-site-status.php:1195
+msgid "https://wordpress.org/support"
+msgstr "https://sv.wordpress.org/support"
+
+#. translators: 1: The IP address WordPress.org resolves to. 2: The error
+#. returned by the lookup.
+#: includes/class-health-check-site-status.php:1185
+msgid "Your site is unable to reach WordPress.org at %1$s, and returned the error: %2$s"
+msgstr "Din webbplats kan inte nå WordPress.org via %1$s, utan ger följande felkod: %2$s"
+
+#: includes/class-health-check-site-status.php:1176
+msgid "Could not reach WordPress.org"
+msgstr "Kunde inte nå WordPress.org"
+
+#: includes/class-health-check-site-status.php:1159
+msgid "Communicating with the WordPress servers is used to check for new versions, and to both install and update WordPress core, themes or plugins."
+msgstr "Kommunikation med WordPress servrar används för att kontrollera om det finns nya versioner och för att båda installera och uppdatera WordPress-kärnan, teman och tillägg."
+
+#: includes/class-health-check-site-status.php:1151
+msgid "Can communicate with WordPress.org"
+msgstr "Kommunikation med WordPress.org fungerar"
+
+#. translators: 1: Name of the library, 2: Number of version.
+#: includes/class-health-check-site-status.php:1115
+#: includes/class-health-check-site-status.php:1131
+msgid "WordPress’ utf8mb4 support requires MySQL client library (%1$s) version %2$s or newer. Please contact your server administrator."
+msgstr "För utf8mb4-stöd i WordPress krävs MySQL klientbibliotek (%1$s) version %2$s eller senare. Kontakta din serveradministratör."
+
+#: includes/class-health-check-site-status.php:1109
+#: includes/class-health-check-site-status.php:1125
+msgid "utf8mb4 requires a newer client library"
+msgstr "För utf8mb4 krävs ett nyare klientbibliotek"
+
+#. translators: %s: Version number.
+#: includes/class-health-check-site-status.php:1080
+msgid "WordPress’ utf8mb4 support requires MariaDB version %s or greater. Please contact your server administrator."
+msgstr "För utf8mb4-stöd i WordPress krävs MariaDB version %s eller senare. Kontakta din serveradministratör."
+
+#: includes/class-health-check-site-status.php:1074
+msgid "utf8mb4 requires a MariaDB update"
+msgstr "För utf8mb4 behöver MariaDB uppdateras"
+
+#. translators: %s: Version number.
+#: includes/class-health-check-site-status.php:1060
+msgid "WordPress’ utf8mb4 support requires MySQL version %s or greater. Please contact your server administrator."
+msgstr "För utf8mb4-stöd i WordPress krävs MySQL version %s eller senare. Kontakta din serveradministratör."
+
+#: includes/class-health-check-site-status.php:1054
+msgid "utf8mb4 requires a MySQL update"
+msgstr "För utf8mb4 behöver MySQL uppdateras"
+
+#: includes/class-health-check-site-status.php:1044
+msgid "UTF8MB4 is a database storage attribute that makes sure your site can store non-English text and other strings (for instance emoticons) without unexpected problems."
+msgstr "UTF8MB4 är en parameter för databaslagring som säkerställer att din webbplats kan lagra text och andra strängar som inte är på engelska (t.ex. emotikoner) utan att oväntade problem uppstår."
+
+#: includes/class-health-check-site-status.php:1036
+msgid "UTF8MB4 is supported"
+msgstr "UTF8MB4 stöds"
+
+#. translators: 1: The name of the drop-in. 2: The name of the database engine.
+#: includes/class-health-check-site-status.php:1011
+msgid "You are using a %1$s drop-in which might mean that a %2$s database is not being used."
+msgstr "Du använder insticksprogrammet %1$s vilket kan innebära att det inte är en %2$s-databas som används."
+
+#. translators: 1: The database engine in use (MySQL or MariaDB). 2: Database
+#. server minimum version number.
+#: includes/class-health-check-site-status.php:998
+msgid "WordPress requires %1$s version %2$s or higher. Contact your web hosting company to correct this."
+msgstr "WordPress kräver %1$s version %2$s eller senare. Kontakta ditt webbhotell för att korrigera detta."
+
+#: includes/class-health-check-site-status.php:991
+msgid "Severely outdated SQL server"
+msgstr "SQL-servern är kraftigt föråldrad"
+
+#. translators: 1: The database engine in use (MySQL or MariaDB). 2: Database
+#. server recommended version number.
+#: includes/class-health-check-site-status.php:981
+msgid "For optimal performance and security reasons, we recommend running %1$s version %2$s or higher. Contact your web hosting company to correct this."
+msgstr "För optimala prestanda och av säkerhetskä rekommenderar vi att man använder %1$s version %2$s eller senare. Kontakta ditt webbhotell för att korrigera detta."
+
+#: includes/class-health-check-site-status.php:975
+msgid "Outdated SQL server"
+msgstr "Föråldrad SQL-server"
+
+#: includes/class-health-check-site-status.php:963
+msgid "Read more about what WordPress requires to run."
+msgstr "Läs mer om vad som krävs för att köra WordPress."
+
+#. translators: Localized version of WordPress requirements if one exists.
+#: includes/class-health-check-site-status.php:962
+msgid "https://wordpress.org/about/requirements/"
+msgstr "https://wordpress.org/about/requirements/"
+
+#: includes/class-health-check-site-status.php:957
+msgid "The SQL server is a required piece of software for the database WordPress uses to store all your site’s content and settings."
+msgstr "SQL-servern är en nödvändig programvara som WordPress använder för att lagra allt innehåll och alla inställningar för din webbplats."
+
+#: includes/class-health-check-site-status.php:949
+msgid "SQL server is up to date"
+msgstr "SQL-servern är uppdaterad"
+
+#: includes/class-health-check-site-status.php:928
+msgid "One or more required modules are missing"
+msgstr "En eller flera nödvändiga moduler saknas"
+
+#: includes/class-health-check-site-status.php:925
+msgid "One or more recommended modules are missing"
+msgstr "En eller flera rekommenderade moduler saknas"
+
+#: includes/class-health-check-site-status.php:753
+msgid "the team handbook"
+msgstr "teamets handbok"
+
+#. translators: Localized team handbook, if one exists.
+#: includes/class-health-check-site-status.php:752
+msgid "https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions"
+msgstr "https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions"
+
+#. translators: %s: Link to the hosting group page about recommended PHP
+#. modules.
+#: includes/class-health-check-site-status.php:748
+msgid "The WordPress Hosting Team maintains a list of those modules, both recommended and required, in %s."
+msgstr "WordPress webbhotellsteam underhåller en lista över dessa moduler, både rekommenderade och obligatoriska i %s."
+
+#: includes/class-health-check-site-status.php:745
+msgid "PHP modules perform most of the tasks on the server that make your site run. Any changes to these must be made by your server administrator."
+msgstr "PHP-moduler utför de flesta av serverns uppgifter som behövs för att webbplatsen ska fungera. Eventuella ändringar i dessa måste utföras av er serveradministratör."
+
+#: includes/class-health-check-site-status.php:686
+msgid "Your PHP version requires an update"
+msgstr "Din PHP-version behöver uppdateras"
+
+#: includes/class-health-check-site-status.php:679
+msgid "Your PHP version should be updated"
+msgstr "Din PHP-version bör uppdateras"
+
+#: includes/class-health-check-site-status.php:671
+msgid "We recommend that you update PHP"
+msgstr "Vi rekommenderar att du uppdaterar PHP"
+
+#. translators: accessibility text
+#: includes/class-health-check-site-status.php:659
+#: includes/class-health-check-site-status.php:755
+#: includes/class-health-check-site-status.php:965
+#: includes/class-health-check-site-status.php:1198
+#: includes/class-health-check-site-status.php:1282
+#: includes/class-health-check-site-status.php:1355
+msgid "(opens in a new tab)"
+msgstr "(öppnas i en ny flik)"
+
+#: includes/class-health-check-site-status.php:657
+msgid "Learn more about updating PHP"
+msgstr "Lär dig mer om hur du uppdaterar PHP"
+
+#: includes/class-health-check-site-status.php:652
+msgid "PHP is the programming language we use to build and maintain WordPress. Newer versions of PHP are both faster and more secure, so updating will have a positive effect on your site’s performance."
+msgstr "PHP är programmeringsspråket vi använder för att bygga och underhålla WordPress. Nyare versioner av PHP är mycket snabbare och säkrare. En uppdatering kommer alltså att förbättra webbplatsens prestanda."
+
+#. translators: %s: The current PHP version.
+#: includes/class-health-check-site-status.php:642
+msgid "PHP is up to date (%s)"
+msgstr "PHP är uppdaterat (%s)"
+
+#: includes/compat.php:75
+msgctxt "localized PHP upgrade information page"
+msgid "https://wordpress.org/support/update-php/"
+msgstr "https://sv.wordpress.org/support/update-php/"
+
+#: includes/class-health-check-site-status.php:618
+msgid "Have a default theme available"
+msgstr "Se till att ha ett standardtema tillgängligt"
+
+#. translators: 1: The amount of inactive themes. 2: The default theme for
+#. WordPress. 3: The currently active theme.
+#: includes/class-health-check-site-status.php:598
+msgid "Your site has %1$d inactive theme, other than %2$s, the default WordPress theme, and %3$s, your active theme."
+msgid_plural "Your site has %1$d inactive themes, other than %2$s, the default WordPress theme, and %3$s, your active theme."
+msgstr[0] "Din webbplats har %1$d inaktivt tema, utöver %2$s – standardtemat för WordPress theme, och %3$s – ditt aktiva tema."
+msgstr[1] "Din webbplats har %1$d inaktiva teman, utöver %2$s – standardtemat för WordPress theme, och %3$s – ditt aktiva tema."
+
+#: includes/class-health-check-site-status.php:591
+#: includes/class-health-check-site-status.php:608
+msgid "We recommend removing any unused themes to enhance your site’s security."
+msgstr "Vi rekommenderar att du tar bort oanvända teman för att öka webbplatsens säkerhet."
+
+#. translators: 1: The amount of inactive themes. 2: The currently active
+#. theme.
+#: includes/class-health-check-site-status.php:582
+msgid "Your site has %1$d inactive theme, other than %2$s, your active theme."
+msgid_plural "Your site has %1$d inactive themes, other than %2$s, your active theme."
+msgstr[0] "Din webbplats har %1$d inaktivt tema, utöver %2$s – ditt aktiva tema."
+msgstr[1] "Din webbplats har %1$d inaktiva teman, utöver %2$s – ditt aktiva tema."
+
+#. translators: 1: The default theme for WordPress. 2: The currently active
+#. theme. 3: The active theme's parent theme.
+#: includes/class-health-check-site-status.php:564
+msgid "To enhance your site’s security, we recommend you remove any themes you’re not using. You should keep %1$s, the default WordPress theme, %2$s, your current theme, and %3$s, its parent theme."
+msgstr "För att höja säkerheten för din webbplats rekommenderar vi att du tar bort alla teman du inte använder. Du bör behålla %1$s – WordPress standardtema, %2$s – ditt aktuella tema och %3$s – dess huvudtema."
+
+#. translators: 1: The currently active theme. 2: The active theme's parent
+#. theme.
+#: includes/class-health-check-site-status.php:544
+msgid "To enhance your site’s security, we recommend you remove any themes you’re not using. You should keep your current theme, %1$s, and %2$s, its parent theme."
+msgstr "För att höja säkerheten för din webbplats rekommenderar vi att du tar bort alla teman du inte använder. Du bör behålla %1$s – ditt aktuella tema och %2$s – dess huvudtema."
+
+#. translators: %d: The number of inactive themes.
+#: includes/class-health-check-site-status.php:534
+#: includes/class-health-check-site-status.php:554
+msgid "Your site has %d inactive theme."
+msgid_plural "Your site has %d inactive themes."
+msgstr[0] "Din webbplats har %d inaktivt tema."
+msgstr[1] "Din webbplats har %d inaktiva teman."
+
+#: includes/class-health-check-site-status.php:527
+#: includes/class-health-check-site-status.php:575
+msgid "You should remove inactive themes"
+msgstr "Du bör ta bort inaktiva teman"
+
+#: includes/class-health-check-site-status.php:481
+msgid "You have themes waiting to be updated"
+msgstr "Du har teman som behöver uppdateras"
+
+#: includes/class-health-check-site-status.php:419
+msgid "Manage your themes"
+msgstr "Hantera dina teman"
+
+#: includes/class-health-check-site-status.php:414
+msgid "Themes add your site’s look and feel. It’s important to keep them up to date, to stay consistent with your brand and keep your site secure."
+msgstr "Teman formar utseendet och känslan hos din webbplats. Det är viktigt att hålla dem uppdaterade för att stödja ert varumärke och hålla webbplatsen säker."
+
+#: includes/class-health-check-site-status.php:406
+msgid "Your themes are up to date"
+msgstr "Dina teman är uppdaterade"
+
+#: includes/class-health-check-site-status.php:387
+msgid "Manage inactive plugins"
+msgstr "Hantera inaktiva tillägg"
+
+#: includes/class-health-check-site-status.php:381
+msgid "Inactive plugins are tempting targets for attackers. If you’re not going to use a plugin, we recommend you remove it."
+msgstr "Inaktiva tillägg är lockande måltavlor att attackera. Om du inte kommer att använda något tillägg rekommenderar vi att du tar bort det."
+
+#. translators: %d: The number of inactive plugins.
+#: includes/class-health-check-site-status.php:373
+msgid "Your site has %d inactive plugin."
+msgid_plural "Your site has %d inactive plugins."
+msgstr[0] "Din webbplats har %d inaktivt tillägg."
+msgstr[1] "Din webbplats har %d inaktiva tillägg."
+
+#: includes/class-health-check-site-status.php:367
+msgid "You should remove inactive plugins"
+msgstr "Du bör ta bort inaktiva tillägg"
+
+#: includes/class-health-check-site-status.php:336
+msgid "Update your plugins"
+msgstr "Uppdatera dina tillägg"
+
+#: includes/class-health-check-site-status.php:317
+msgid "You have plugins waiting to be updated"
+msgstr "Du har tillägg som väntar på att uppdateras"
+
+#: includes/class-health-check-site-status.php:284
+msgid "Manage your plugins"
+msgstr "Hantera dina tillägg"
+
+#: includes/class-health-check-site-status.php:279
+msgid "Plugins extend your site’s functionality with things like contact forms, ecommerce and much more. That means they have deep access to your site, so it’s vital to keep them up to date."
+msgstr "Tillägg utökar funktionaliteten hos din webbplats med sådana saker som kontaktformulär, e-handel och mycket annat. Det innebär att de har djup åtkomst till din webbplats. Därför är det viktigt att hålla dem uppdaterade."
+
+#: includes/class-health-check-site-status.php:271
+msgid "Your plugins are up to date"
+msgstr "Dina tillägg är uppdaterade"
+
+#: includes/class-health-check-site-status.php:211
+msgid "You are currently running the latest version of WordPress available, keep it up!"
+msgstr "Just nu använder du den senaste versionen av WordPress. Fortsätt så!"
+
+#. translators: %s: The current version of WordPress installed on this site.
+#: includes/class-health-check-site-status.php:205
+msgid "Your WordPress version is up to date (%s)"
+msgstr "Din WordPress-version är uppdaterad (%s)"
+
+#: includes/class-health-check-site-status.php:198
+msgid "A new minor update is available for your site. Because minor updates often address security, it’s important to install them."
+msgstr "Det finns en mindre uppdatering för din webbplats. Eftersom mindre uppdateringar ofta löser säkerhetsproblem är det viktigt att installera dem."
+
+#: includes/class-health-check-site-status.php:195
+#: includes/class-health-check-site-status.php:274
+#: includes/class-health-check-site-status.php:409
+#: includes/class-health-check-site-status.php:688
+#: includes/class-health-check-site-status.php:992
+#: includes/class-health-check-site-status.php:1154
+#: includes/class-health-check-site-status.php:1269
+#: includes/class-health-check-site-status.php:1342
+#: includes/class-health-check-site-status.php:1405
+#: includes/class-health-check-site-status.php:1523
+#: includes/class-health-check-site-status.php:1589
+msgid "Security"
+msgstr "Säkerhet"
+
+#: includes/class-health-check-site-status.php:190
+msgid "A new version of WordPress is available."
+msgstr "En ny version av WordPress är tillgänglig."
+
+#: includes/class-health-check-site-status.php:182
+msgid "Install the latest version of WordPress"
+msgstr "Installera den senaste versionen av WordPress."
+
+#. translators: %s: The latest version of WordPress available.
+#: includes/class-health-check-site-status.php:175
+msgid "WordPress update available (%s)"
+msgstr "WordPress-uppdatering tillgänglig (%s)"
+
+#: includes/class-health-check-site-status.php:162
+msgid "Check for updates manually"
+msgstr "Kontrollera uppdateringar manuellt"
+
+#: includes/class-health-check-site-status.php:156
+msgid "We were unable to check if any new versions of WordPress are available."
+msgstr "Vi lyckades inte kontrollera om det finns nya versioner av WordPress."
+
+#. translators: %s: Your current version of WordPress.
+#: includes/class-health-check-site-status.php:150
+msgid "WordPress version %s"
+msgstr "WordPress-version %s"
+
+#: includes/class-health-check-site-status.php:134
+#: includes/class-health-check-site-status.php:647
+#: includes/class-health-check-site-status.php:740
+#: includes/class-health-check-site-status.php:952
+#: includes/class-health-check-site-status.php:1039
+#: includes/class-health-check-site-status.php:1224
+#: includes/class-health-check-site-status.php:1451
+#: includes/class-health-check-site-status.php:1659
+#: includes/class-health-check-site-status.php:1707
+#: includes/class-health-check-site-status.php:1778
+msgid "Performance"
+msgstr "Prestanda"
+
+#. translators: %s: Name of the filter used.
+#: includes/class-health-check-auto-updates.php:121
+msgid "Could not confirm that the %s filter is available."
+msgstr "Det gick inte att bekräfta om filtret %s är tillgängligt."
+
+#: includes/tools/class-health-check-files-integrity.php:152
+#: includes/class-health-check-site-status.php:886
+#: includes/class-health-check-site-status.php:1182
+#: includes/class-health-check-site-status.php:1549
+#: includes/class-health-check-site-status.php:1613
+msgid "Error"
+msgstr "Fel"
+
+#: includes/class-health-check.php:544
+msgid "Once weekly"
+msgstr "En gång i veckan"
+
+#: includes/class-health-check.php:497
+msgid "Info"
+msgstr "Info"
+
+#: includes/class-health-check.php:385
+msgctxt "Page Title"
+msgid "Site Health"
+msgstr "Hälsokontroll för webbplatser"
+
+#. translators: %s: Critical issue counter, if any.
+#: includes/class-health-check.php:377
+msgctxt "Menu Title"
+msgid "Site Health %s"
+msgstr "Hälsostatus %s"
+
+#: includes/class-health-check.php:370
+msgctxt "Issue counter label for the admin menu"
+msgid "Critical issues"
+msgstr "Kritiska problem"
+
+#. translators: %s: Amount of passed tests.
+#: includes/class-health-check.php:246
+msgid "%s Items with no issues detected"
+msgstr "%s Objekt där inga problem hittades"
+
+#. translators: %s: Amount of passed tests.
+#. translators: %s: number of items with no issues
+#: includes/class-health-check.php:244 pages/site-status.php:71
+msgid "%s Item with no issues detected"
+msgid_plural "%s Items with no issues detected"
+msgstr[0] "%s objekt utan detekterade problem"
+msgstr[1] "%s objekt utan detekterade problem"
+
+#. translators: %s: Amount of recommended issues.
+#: includes/class-health-check.php:242
+msgid "%s Recommended improvements"
+msgstr "%s rekommenderade förbättringar"
+
+#. translators: %s: Amount of recommended issues.
+#. translators: %s: number of recommended improvements
+#: includes/class-health-check.php:240 pages/site-status.php:52
+msgid "%s Recommended improvement"
+msgid_plural "%s Recommended improvements"
+msgstr[0] "%s rekommenderad förbättring"
+msgstr[1] "%s rekommenderade förbättringar"
+
+#. translators: %s: Amount of critical issues.
+#: includes/class-health-check.php:238
+msgid "%s Critical issues"
+msgstr "%s Kritiska problem"
+
+#. translators: %s: Amount of critical issues.
+#. translators: %s: number of critical issues found
+#: includes/class-health-check.php:236 pages/site-status.php:41
+msgid "%s Critical issue"
+msgid_plural "%s Critical issues"
+msgstr[0] "%s allvarligt problem"
+msgstr[1] "%s allvarliga problem"
+
+#: includes/class-health-check.php:234
+msgid "Site information has been added to your clipboard."
+msgstr "Information om webbplatsen har kopierats till ditt urklipp."
+
+#: includes/class-health-check.php:230
+msgid "All site health tests have finished running. Your site is looking good, and the results are now available on the page."
+msgstr "Alla tester av webbplatsens hälsa har avslutats. Din webbplats klarade sig väl och resultaten är nu synliga på sidan."
+
+#: includes/class-health-check.php:229
+msgid "All site health tests have finished running."
+msgstr "Alla hälsokontroller för webbplatsen är klara."
+
+#. translators: %d: The HTTP response code returned.
+#: includes/class-health-check-loopback.php:95
+msgid "The loopback request returned an unexpected http status code, %d, it was not possible to determine if this will prevent features from working as expected."
+msgstr "Begäran om återanrop fick en oväntad http-svarskod, %d. Det gick inte att avgöra om detta kan hindra vissa funktioner att fungera som förväntat."
+
+#: includes/class-health-check-loopback.php:79
+msgid "The loopback request to your site failed, this means features relying on them are not currently working as expected."
+msgstr "Återanropet till din webbplats misslyckades. Det betyder att funktioner som är beroende av dem för närvarande inte fungerar som förväntat."
+
+#. translators: %d: The amount of notices that are visible.
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:1182
+msgid "Notices (%d)"
+msgstr "Notiser (%d)"
+
+#. translators: %d: The amount of available themes.
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:1104
+msgid "Available themes (%d)"
+msgstr "Tillgängliga teman (%d)"
+
+#. translators: %d: The amount of available plugins.
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:1008
+msgid "Available plugins (%d)"
+msgstr "Tillgängliga tillägg (%d)"
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:969
+msgid "enabled"
+msgstr "aktiverat"
+
+#: includes/class-health-check-site-status.php:894
+#: includes/class-health-check-site-status.php:1557
+#: includes/class-health-check-site-status.php:1621
+msgid "Warning"
+msgstr "Varning"
+
+#. translators: %s: The running status of Troubleshooting Mode.
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:966
+msgid "Troubleshooting Mode - %s"
+msgstr "Felsökningsläge – %s"
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:872
+msgctxt "Prefix for inactive themes in troubleshooting mode"
+msgid "Switch to"
+msgstr "Växla till"
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:872
+msgctxt "Prefix for the active theme in troubleshooting mode"
+msgid "Active:"
+msgstr "Aktiv:"
+
+#: includes/tools/class-health-check-files-integrity.php:197
+#: includes/tools/class-health-check-files-integrity.php:206
+msgid "You do not have access to this file."
+msgstr "Du saknar åtkomst till denna fil."
+
+#: includes/class-health-check-debug-data.php:584
+msgid "(Does not support 64bit values)"
+msgstr "(Stöder inte 64-bitarsvärden)"
+
+#: includes/class-health-check-debug-data.php:624
+msgid "Unable to determine what web server software is used"
+msgstr "Det går inte att avgöra vilken programvara webbservern använder"
+
+#: includes/class-health-check-updates.php:368
+msgid "Theme updates should be working as expected."
+msgstr "Uppdatering av teman bör fungera normalt."
+
+#. translators: %s: List of theme names.
+#: includes/class-health-check-updates.php:360
+msgid "The following Themes have been removed from update checks: %s."
+msgstr "Följande teman har undantagits från kontroll av uppdateringar: %s."
+
+#: includes/class-health-check-updates.php:349
+msgid "Theme update requests have been blocked."
+msgstr "Förfrågningar om uppdatering av teman är blockerade."
+
+#: includes/class-health-check-updates.php:340
+msgid "Theme update hooks have been removed."
+msgstr "Åtgärds-hooken för temauppdateringar är borttagen."
+
+#: includes/class-health-check-updates.php:128
+msgid "Plugin updates should be working as expected."
+msgstr "Uppdateringar av tillägg bör fungera normalt."
+
+#. translators: %s: List of plugin names.
+#: includes/class-health-check-updates.php:120
+msgid "The following Plugins have been removed from update checks: %s."
+msgstr "Följande tillägg har undantagits från kontroll av uppdateringar: %s."
+
+#: includes/class-health-check-updates.php:109
+msgid "Plugin update requests have been blocked."
+msgstr "Förfrågningar om uppdatering av tillägg är blockerade."
+
+#: includes/class-health-check-updates.php:100
+msgid "Plugin update hooks have been removed."
+msgstr "Åtgärds-hooken för tilläggsuppdateringar är borttagen."
+
+#. translators: %s: The custom message that may be included with the email.
+#: includes/tools/class-health-check-mail-check.php:70
+msgid "Additional message from admin: %s"
+msgstr "Extra meddelande från admin: %s"
+
+#. translators: %1$s: website name. %2$s: website url. %3$s: The date the
+#. message was sent. %4$s: The time the message was sent.
+#: includes/tools/class-health-check-mail-check.php:59
+msgid "Hi! This test message was sent by the Health Check plugin from %1$s (%2$s) on %3$s at %4$s. Since you’re reading this, it obviously works."
+msgstr "Hej! Det här är ett provmeddelande som skickades från tillägget Health Check på ”%1$s” (%2$s) den %3$s kl. %4$s. Det måste ha fungerat, eftersom du läser detta nu."
+
+#: includes/class-health-check-site-status.php:1924
+msgid "HTTP Requests"
+msgstr "HTTP-förfrågningar"
+
+#: includes/class-health-check-site-status.php:1904
+msgid "PHP Extensions"
+msgstr "PHP-utökningar"
+
+#. translators: %s: the name of the query parameter being tested.
+#: includes/class-health-check-site-status.php:1857
+msgid "The REST API did not process the %s query parameter correctly."
+msgstr "REST-API behandlade inte förfråningsparametern %s korrekt."
+
+#: includes/class-health-check-site-status.php:1704
+msgid "HTTP requests seem to be working as expected"
+msgstr "HTTP-förfrågningar verkar fungera som förväntat"
+
+#: includes/class-health-check-site-status.php:737
+msgid "Required and recommended modules are installed"
+msgstr "Obligatoriska och rekommenderade moduler är installerade"
+
+#. translators: %s: The module name.
+#: includes/class-health-check-site-status.php:897
+msgid "The optional module, %s, is not installed, or has been disabled."
+msgstr "Den valfria modulen %s är inte installerad eller är inaktiverad."
+
+#: includes/class-health-check-site-status.php:1955
+msgid "REST API availability"
+msgstr "Tillgänglighet för REST-API"
+
+#: includes/class-health-check-site-status.php:1775
+msgid "The REST API is available"
+msgstr "REST-API är tillgängligt"
+
+#. translators: 1: The HTTP response code returned. 2: The error message
+#. returned.
+#: includes/class-health-check-site-status.php:1840
+msgid "The REST API call gave the following unexpected result: (%1$d) %2$s."
+msgstr "Anropet till REST-API gav följande oväntade resultat: (%1$d) %2$s."
+
+#: includes/class-health-check-site-status.php:1822
+msgid "The REST API request failed due to an error."
+msgstr "Förfrågan över REST-API misslyckades på grund av ett fel."
+
+#. Plugin Name of the plugin
+msgid "Health Check & Troubleshooting"
+msgstr "Health Check & Troubleshooting"
+
+#: includes/class-health-check-site-status.php:1900
+msgid "Database Server version"
+msgstr "Databasserverns version"
+
+#: includes/class-health-check-site-status.php:1892
+msgid "Theme Versions"
+msgstr "Versioner av teman"
+
+#: includes/class-health-check-site-status.php:1888
+msgid "Plugin Versions"
+msgstr "Versioner av tillägg"
+
+#: includes/class-health-check-site-status.php:1884
+msgid "WordPress Version"
+msgstr "Version av WordPress"
+
+#: includes/class-health-check.php:228
+msgid "Currently being tested..."
+msgstr "Testas för närvarande..."
+
+#: includes/class-health-check-troubleshoot.php:172
+msgid "You have successfully enabled Troubleshooting Mode, all plugins will appear inactive until you disable Troubleshooting Mode, or log out and back in again."
+msgstr "Du har startat felsökningsläget och alla tillägg kommer att verka vara inaktiverade tills du antingen avslutar felsökningsläget eller loggar ut och sedan loggar in igen."
+
+#. translators: %s: URL to Settings > General to change options.
+#: includes/class-health-check-site-status.php:1373
+msgid "You are accessing this website using HTTPS, but your WordPress Address is not set up to use HTTPS by default."
+msgstr "Du använder denna webbplats via HTTPS, men din WordPressadress är inte inställd på att som standard använda HTTPS."
+
+#: includes/class-health-check-site-status.php:622
+msgid "Your site does not have any default theme. Default themes are used by WordPress automatically if anything is wrong with your normal theme."
+msgstr "Din webbplats har inget standardtema. WordPress använder automatiskt standardteman om något är fel med ditt vanliga tema."
+
+#. translators: %d: The number of themes.
+#: includes/class-health-check-site-status.php:508
+msgid "Your site has %d installed theme, and they are all up to date."
+msgid_plural "Your site has %d installed themes, and they are all up to date."
+msgstr[0] "Din webbplats har %d installerat tema, och det är uppdaterat."
+msgstr[1] "Din webbplats har %d installerade teman, och alla är uppdaterade."
+
+#. translators: %d: The number of outdated themes.
+#: includes/class-health-check-site-status.php:487
+msgid "Your site has %d theme waiting to be updated."
+msgid_plural "Your site has %d themes waiting to be updated."
+msgstr[0] "Din webbplats har %d tema som väntar på att uppdateras."
+msgstr[1] "Din webbplats har %d teman som väntar på att uppdateras."
+
+#. translators: %d: The number of active plugins.
+#: includes/class-health-check-site-status.php:349
+msgid "Your site has %d active plugin, and they are all up to date."
+msgid_plural "Your site has %d active plugins, and they are all up to date."
+msgstr[0] "Din webbplats har %d aktivt tillägg och det är uppdaterat."
+msgstr[1] "Din webbplats har %d aktiva tillägg och de är alla uppdaterade."
+
+#. translators: %d: The number of outdated plugins.
+#: includes/class-health-check-site-status.php:323
+msgid "Your site has %d plugin waiting to be updated."
+msgid_plural "Your site has %d plugins waiting to be updated."
+msgstr[0] "Din webbplats har %d tillägg som väntar på att uppdateras."
+msgstr[1] "Din webbplats har %d tillägg som väntar på att uppdateras."
+
+#. translators: %s: The active theme name.
+#: includes/class-health-check-loopback.php:196
+msgid "Active theme: %s"
+msgstr "Aktivt tema: %s"
+
+#: includes/class-health-check-loopback.php:188
+#: includes/class-health-check-loopback.php:199
+msgid "Waiting..."
+msgstr "Väntar..."
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:1139
+msgid "Switch to this theme"
+msgstr "Byt till detta tema"
+
+#. translators: %s: Theme name.
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:1135
+msgid "Switch the active theme to %s"
+msgstr "Byt aktivt tema till %s"
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:1070
+msgid "Enable"
+msgstr "Aktivera"
+
+#. translators: %s: Plugin name.
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:1066
+msgid "Enable the plugin, %s, while troubleshooting."
+msgstr "Aktivera tillägget %s inom felsökningsläget."
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:1051
+msgid "Disable"
+msgstr "Inaktivera"
+
+#. translators: %s: Plugin name.
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:1047
+msgid "Disable the plugin, %s, while troubleshooting."
+msgstr "Inaktivera tillägget %s inom felsökningsläget."
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:1228
+msgid "Dismiss notices"
+msgstr "Avfärda notiser"
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:1202
+msgid "Plugin actions, such as activating and deactivating, are not available while in Troubleshooting Mode."
+msgstr "Åtgärder med tillägg, såsom att aktivera eller inaktivera dem, är inte möjliga medan felsökningsläget är aktivt."
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:1194
+msgid "There are no notices to show."
+msgstr "Det finns inga notiser att visa."
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:995
+msgid "Here you can enable individual plugins or themes, helping you to find out what might be causing strange behaviors on your site. Do note that any changes you make to settings will be kept when you disable Troubleshooting Mode."
+msgstr "Här kan du aktivera enstaka tillägg eller teman, vilket kan hjälpa dig att ta reda på vad som får webbplatsen att bete sig underligt. Observera att alla ändringar du gör i webbplatsens inställningar kommer att finnas kvar när felsökningsläget avslutas."
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:991
+msgid "Your site is currently in Troubleshooting Mode. This has no effect on your site visitors, they will continue to view your site as usual, but for you it will look as if you had just installed WordPress for the first time."
+msgstr "Din webbplats är just nu i felsökningsläge. Detta har ingen effekt på besökarna till din webbplats, för dem ser webbplatsen helt normal ut, men för dig ser det ut som om du just installerat WordPress för första gången."
+
+#. translators: %s: The theme slug that was switched to.
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:710
+msgid "When switching the active theme to %s, a site failure occurred. Because of this we reverted the theme to the one you used previously."
+msgstr "Vid byte av aktivt tema till %s inträffade ett fel på webbplatsen. Därför har temat återställts till det tema som användes innan."
+
+#. translators: %s: The plugin slug that was disabled.
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:687
+msgid "When disabling the plugin, %s, a site failure occurred. Because of this the change was automatically reverted."
+msgstr "Vid inaktivering av tillägget %s inträffade ett fel på webbplatsen. Därför backades ändringen automatiskt till ogjord."
+
+#. translators: %s: The plugin slug that was enabled.
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:661
+msgid "When enabling the plugin, %s, a site failure occurred. Because of this the change was automatically reverted."
+msgstr "Vid aktivering av tillägget %s inträffade ett fel på webbplatsen. Därför backades ändringen automatiskt till ogjord."
+
+#: includes/class-health-check-troubleshoot.php:98
+msgid "We could not remove the old must-use plugin."
+msgstr "Det gick inte att ta bort det tidigare permanentaktiverade tillägget."
+
+#: includes/tools/class-health-check-mail-check.php:124
+msgid "Send test mail"
+msgstr "Skicka testmeddelande"
+
+#: includes/tools/class-health-check-mail-check.php:118
+msgid "Additional message"
+msgstr "Ytterligare meddelande"
+
+#. translators: %s: website url.
+#: includes/tools/class-health-check-mail-check.php:55
+msgid "Health Check – Test Message from %s"
+msgstr "Health Check – Testmeddelande från %s"
+
+#: includes/tools/class-health-check-files-integrity.php:136
+msgid "One possible reason for this may be that your installation contains translated versions. An easy way to clear this is to reinstall WordPress. Don't worry. This will only affect WordPress' own files, not your themes, plugins or uploaded media."
+msgstr "En möjlig anledning till detta kan vara att din installation innehåller översatta versioner av några filer. Ett enkelt sätt att lösa detta är att installera om WordPress. Du behöver inte vara orolig, det berör bara WordPress egna filer och inte dina teman, tillägg eller uppladdade mediefiler."
+
+#: includes/class-health-check-debug-data.php:459
+msgid "Total installation size"
+msgstr "Total installationsstorlek"
+
+#: includes/class-health-check-debug-data.php:454
+msgid "Database size"
+msgstr "Databasstorlek"
+
+#: includes/class-health-check-debug-data.php:743
+msgid "Your .htaccess file contains only core WordPress features."
+msgstr "Din .htaccess-fil innehåller endast WordPress egna grundläggande funktioner."
+
+#: includes/class-health-check-debug-data.php:743
+msgid "Custom rules have been added to your .htaccess file."
+msgstr "Det har lagts till specialregler i din .htaccess-fil."
+
+#: includes/class-health-check-debug-data.php:742
+msgid ".htaccess rules"
+msgstr ".htaccess-regler"
+
+#: includes/class-health-check-debug-data.php:473
+#: includes/class-health-check-debug-data.php:495
+#: includes/class-health-check-debug-data.php:1383
+msgid "Not available"
+msgstr "Inte tillgänglig"
+
+#. translators: %s: Latest WordPress version number.
+#. translators: %s: Latest plugin version number.
+#. translators: %s: Latest theme version number.
+#: includes/class-health-check-debug-data.php:62
+#: includes/class-health-check-debug-data.php:880
+#: includes/class-health-check-debug-data.php:912
+#: includes/class-health-check-debug-data.php:970
+#: includes/class-health-check-debug-data.php:1054
+msgid "(Latest version: %s)"
+msgstr "(Senaste version: %s)"
+
+#. translators: Prefix for the active theme in a listing.
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:1145
+msgid "Active:"
+msgstr "Aktivt:"
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:856
+msgid "Themes"
+msgstr "Teman"
+
+#: includes/tools/class-health-check-files-integrity.php:219
+msgid "Modified"
+msgstr "Ändrad version"
+
+#: includes/tools/class-health-check-files-integrity.php:217
+msgid "Original"
+msgstr "Original"
+
+#: includes/tools/class-health-check-mail-check.php:112
+msgid "Email"
+msgstr "E-post"
+
+#: includes/tools/class-health-check-mail-check.php:21
+msgid "The Mail Check will invoke the wp_mail() function and check if it succeeds. We will use the E-mail address you have set up, but you can change it below if you like."
+msgstr "Kontrollen av e-post kommer att anropa funktionen wp_mail() och kontrollera om detta lyckas. Vi använder den e-postadress du har angett men om du vill kan du ändra den här nedan."
+
+#: includes/tools/class-health-check-mail-check.php:20
+msgid "Mail Check"
+msgstr "Kontroll av e-post"
+
+#: includes/tools/class-health-check-files-integrity.php:240
+msgid "Check the Files Integrity"
+msgstr "Kontrollera av att filer är intakta"
+
+#: includes/tools/class-health-check-files-integrity.php:21
+msgid "The File Integrity checks all the core files with the checksums provided by the WordPress API to see if they are intact. If there are changes you will be able to make a Diff between the files hosted on WordPress.org and your installation to see what has been changed."
+msgstr "Kontrollen att filer är intakta kontrollerar alla filer i kärnan mot kontrollsummor från WordPress-API för att bekräfta att de är oskadade. Om ändringar detekteras kan du skapa en jämförelsefil mellan filen som finns på WordPress.org och filen i din installation för att kunna se vad som är ändrat."
+
+#: includes/tools/class-health-check-files-integrity.php:20
+msgid "File integrity"
+msgstr "Intakta filer"
+
+#: includes/class-health-check-debug-data.php:676
+#: includes/class-health-check-debug-data.php:681
+msgid "cURL version"
+msgstr "cURL-version"
+
+#: includes/tools/class-health-check-mail-check.php:83
+msgid "It seems there was a problem sending the e-mail."
+msgstr "Det verkar vara problem med att skicka e-posten."
+
+#: includes/tools/class-health-check-mail-check.php:79
+msgid "We have just sent an e-mail using wp_mail() and it seems to work. Please check your inbox and spam folder to see if you received it."
+msgstr "Vi har just skickat ett e-postmeddelande med hjälp av wp_mail() och det verkar fungera. Kontrollera din inkorg och skräpmeddelandena för att se om det kommit fram."
+
+#: includes/class-health-check-loopback.php:171
+msgid "Result from testing without any plugins active and a default theme"
+msgstr "Resultat från test utan några aktiva tillägg och ett standardtema"
+
+#: includes/tools/class-health-check-files-integrity.php:142
+#: includes/tools/class-health-check-files-integrity.php:148
+msgid "Reason"
+msgstr "Orsak"
+
+#: includes/tools/class-health-check-files-integrity.php:140
+#: includes/tools/class-health-check-files-integrity.php:146
+msgid "File"
+msgstr "Fil"
+
+#: includes/class-health-check.php:496
+#: includes/tools/class-health-check-files-integrity.php:138
+#: includes/tools/class-health-check-files-integrity.php:144
+msgid "Status"
+msgstr "Status"
+
+#: includes/tools/class-health-check-files-integrity.php:135
+msgid "It appears as if some files may have been modified."
+msgstr "Det verkar som om vissa filer har ändrats."
+
+#: includes/tools/class-health-check-files-integrity.php:131
+msgid "All files passed the check. Everything seems to be ok!"
+msgstr "Alla filer klarade kontrollen. Allt verkar vara OK!"
+
+#: includes/tools/class-health-check-files-integrity.php:107
+msgid "File not found"
+msgstr "Filen hittades inte"
+
+#: includes/tools/class-health-check-files-integrity.php:104
+msgid "(View Diff)"
+msgstr "(Visa ändringar)"
+
+#: includes/tools/class-health-check-files-integrity.php:104
+msgid "Content changed"
+msgstr "Innehållet ändrat"
+
+#: includes/class-health-check.php:499 pages/tools.php:16
+msgid "Tools"
+msgstr "Verktyg"
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:893
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:985
+#: includes/class-health-check-troubleshoot.php:244
+msgid "Disable Troubleshooting Mode"
+msgstr "Avsluta felsökningsläget"
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:166
+msgid "Install a default theme"
+msgstr "Installera ett standardtema"
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:157
+msgid "You don't have any of the default themes installed. A default theme helps you determine if your current theme is causing conflicts."
+msgstr "Du har inget standardtema installerat. Ett standardtema kan hjälpa dig att kontrollera om ditt nuvarande tema orsakar konflikter."
+
+#: includes/class-health-check.php:451
+msgctxt "Menu, Section and Page Title"
+msgid "Health Check"
+msgstr "Hälsokontroll"
+
+#. Translators: %s: Plugin slug.
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:826
+msgid "Enable %s"
+msgstr "Aktivera %s"
+
+#. Translators: %s: Plugin slug.
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:811
+msgid "Disable %s"
+msgstr "Inaktivera %s"
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:772
+msgid "Manage active plugins"
+msgstr "Hantera aktiverade tillägg"
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:310
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:386
+msgid "Enable while troubleshooting"
+msgstr "Aktivera i samband med felsökning"
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:311
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:373
+msgid "Disable while troubleshooting"
+msgstr "Inaktivera i samband med felsökning"
+
+#: pages/troubleshoot.php:29
+msgid "A Troubleshooting Mode menu is added to your admin bar, which will allow you to enable plugins individually, switch back to your current theme, and disable Troubleshooting Mode."
+msgstr "En meny för felsökningsläget läggs till i adminmenyn, där du kan aktivera enstaka tillägg, växla tillbaka till ditt vanliga tema och avsluta felsökningsläget."
+
+#: pages/troubleshoot.php:25
+msgid "By enabling the Troubleshooting Mode, all plugins will appear inactive and your site will switch to the default theme only for you. All other users will see your site as usual."
+msgstr "När du startar felsökningsläget kommer alla tillägg att verka vara inaktiverade och din webbplats kommer att växla till standardtemat, men bara för dig. För alla övriga användare kommer din webbplats att se ut som vanligt."
+
+#: pages/troubleshoot.php:20
+msgid "When troubleshooting issues on your site, you are likely to be told to disable all plugins and switch to the default theme."
+msgstr "I samband med att du felsöker problem på din webbplats är det troligt att man ber dig inaktivera alla tillägg och växla till standardtemat."
+
+#. translators: %1$d: The HTTP response code. %2$s: The error message returned.
+#: includes/class-health-check-loopback.php:82
+msgid "Error encountered: (%1$d) %2$s"
+msgstr "Ett fel har uppstått: (%1$d) %2$s"
+
+#: includes/class-health-check-debug-data.php:801
+msgid "Database name"
+msgstr "Databasens namn"
+
+#: includes/class-health-check-debug-data.php:659
+msgid "Max input time"
+msgstr "Maximal inmatningstid"
+
+#: includes/class-health-check-debug-data.php:564
+msgid "Ghostscript version"
+msgstr "Ghostscript-version"
+
+#: includes/class-health-check-debug-data.php:559
+msgid "Unable to determine if Ghostscript is installed"
+msgstr "Det gick inte att avgöra om Ghostscript är installerat"
+
+#: includes/class-health-check-debug-data.php:543
+msgid "GD version"
+msgstr "GD-version"
+
+#: includes/class-health-check-debug-data.php:529
+msgid "Imagick Resource Limits"
+msgstr "Resursbegränsningar för Imagick"
+
+#: includes/class-health-check-debug-data.php:485
+msgid "Active editor"
+msgstr "Aktiv redigerare"
+
+#: includes/class-health-check-debug-data.php:174
+msgid "Media Handling"
+msgstr "Hantering av media"
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:304
+#: includes/class-health-check.php:433
+msgid "Troubleshoot"
+msgstr "Felsök"
+
+#: includes/class-health-check.php:227
+msgid "Copied"
+msgstr "Kopierat"
+
+#: includes/class-health-check-troubleshoot.php:176
+msgid "Return to the Dashboard"
+msgstr "Återgå till adminpanelen"
+
+#: includes/class-health-check-troubleshoot.php:149
+msgid "We were unable to replace the plugin file required to enable the Troubleshooting Mode."
+msgstr "Det gick inte att byta ut tilläggsfilen som behövs för att aktivera felsökningsläget."
+
+#: includes/class-health-check-troubleshoot.php:255
+msgid "Enable Troubleshooting Mode"
+msgstr "Starta felsökningsläge"
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:781
+msgid "Plugins"
+msgstr "Tillägg"
+
+#: assets/mu-plugin/health-check-troubleshooting-mode.php:762
+msgid "Troubleshooting Mode"
+msgstr "Felsökningsläge"
+
+#: pages/troubleshoot.php:33
+msgid "Please note, that due to how Must Use plugins work, any such plugin will not be disabled for the troubleshooting session."
+msgstr "Observera! Beroende på hur permanentaktiverade tillägg (MU-tillägg) fungerar, kan inga sådana tillägg inaktiveras i samband med felsökningen."
+
+#: pages/troubleshoot.php:21
+msgid "Understandably, you do not wish to do so as it may affect your site visitors, leaving them with lost functionality."
+msgstr "Det är förståeligt att du kanske drar dig för att göra det, eftersom det kan påverka dina webbplatsbesökare som kan komma att bli utan vissa funktioner."
+
+#: includes/class-health-check-troubleshoot.php:105
+msgid "We were unable to copy the plugin file required to enable the Troubleshooting Mode."
+msgstr "Det gick inte att kopiera tilläggsfilen som behövs för att aktivera felsökningsläget."
+
+#: includes/class-health-check-troubleshoot.php:90
+msgid "We were unable to create the mu-plugins directory."
+msgstr "Det gick inte att skapa katalogen ”mu-plugins”."
+
+#: includes/class-health-check.php:498
+msgid "Troubleshooting"
+msgstr "Felsökning"
+
+#: includes/class-health-check.php:226
+msgid "Please wait..."
+msgstr "Vänta ..."
+
+#: includes/class-health-check-site-status.php:1946
+msgid "Loopback request"
+msgstr "Egenanrop"
+
+#: includes/class-health-check-loopback.php:103
+msgid "The loopback request to your site completed successfully."
+msgstr "Egenanrop till din egen webbplats lyckades."
+
+#: includes/class-health-check-site-status.php:1942
+msgid "Background updates"
+msgstr "Uppdateringar i bakgrunden"
+
+#. translators: %s: The name of the failed cron event.
+#: includes/class-health-check-site-status.php:1486
+msgid "The scheduled event, %s, failed to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended."
+msgstr "Den schemalagda händelsen, %s, kördes inte. Din webbplats fungerar ändå, men det kan innebära att schemlagda publicering och automatiska uppdateringar kanske inte fungerar som förväntat."
+
+#: includes/class-health-check-site-status.php:1920
+msgid "Scheduled events"
+msgstr "Schemalagda händelser"
+
+#: includes/class-health-check-site-status.php:1916
+msgid "Secure communication"
+msgstr "Säker kommunikation"
+
+#: includes/class-health-check-wp-cron.php:67
+msgid "No scheduled events exist on this site."
+msgstr "Det finns inga schemalagda händelser på denna webbplats."
+
+#. translators: %s: Plugin version number.
+#. translators: %s: Theme version number.
+#: includes/class-health-check-debug-data.php:835
+#: includes/class-health-check-debug-data.php:873
+#: includes/class-health-check-debug-data.php:1047
+msgid "Version %s"
+msgstr "Version %s"
+
+#. translators: %s: Plugin author name.
+#. translators: %s: Theme author name.
+#: includes/class-health-check-debug-data.php:829
+#: includes/class-health-check-debug-data.php:867
+#: includes/class-health-check-debug-data.php:1041
+msgid "By %s"
+msgstr "Av %s"
+
+#: includes/class-health-check-debug-data.php:819
+#: includes/class-health-check-debug-data.php:857
+#: includes/class-health-check-debug-data.php:1031
+msgid "No version or author information is available."
+msgstr "Ingen information om författaren är tillgänglig."
+
+#: includes/class-health-check-debug-data.php:584
+msgid "(Supports 64bit values)"
+msgstr "(Stöder 64-bitsvärden)"
+
+#. translators: %s: Name of the filter used.
+#: includes/class-health-check-auto-updates.php:446
+msgid "WordPress security and maintenance releases are blocked by the %s filter."
+msgstr "Säkerhets- och underhållsuppdateringar av WordPress blockeras av filtret %s."
+
+#. translators: %s: Name of the constant used.
+#: includes/class-health-check-auto-updates.php:435
+msgid "WordPress security and maintenance releases are blocked by %s."
+msgstr "Säkerhets- och underhållsuppdateringar av WordPress blockeras av %s."
+
+#. translators: %s: Name of the filter used.
+#: includes/class-health-check-auto-updates.php:415
+msgid "WordPress development updates are blocked by the %s filter."
+msgstr "Uppdateringar till utvecklingsversioner av WordPress blockeras av filtret %s."
+
+#. translators: %s: Name of the constant used.
+#: includes/class-health-check-auto-updates.php:404
+msgid "WordPress development updates are blocked by the %s constant."
+msgstr "Uppdateringar till utvecklingsversioner av WordPress blockeras av konstanten %s."
+
+#: includes/class-health-check-auto-updates.php:380
+msgid "All of your WordPress files are writable."
+msgstr "Alla dina WordPress-filer är skrivbara."
+
+#: includes/class-health-check-auto-updates.php:375
+msgid "Some files are not writable by WordPress:"
+msgstr "Vissa filer är inte skrivbara för WordPress:"
+
+#: includes/class-health-check-auto-updates.php:349
+msgid "This could mean that connections are failing to WordPress.org."
+msgstr "Detta kan vara ett tecken på att anrop till WordPress.org misslyckas."
+
+#. translators: %s: WordPress version
+#: includes/class-health-check-auto-updates.php:346
+msgid "Couldn't retrieve a list of the checksums for WordPress %s."
+msgstr "Det gick inte att hämta någon lista med checksummor för WordPress %s."
+
+#: includes/class-health-check-auto-updates.php:299
+msgid "Your installation of WordPress doesn't require FTP credentials to perform updates."
+msgstr "För din WordPress-installation krävs inga inloggningsuppgifter för FPT för att genomföra uppdateringar."
+
+#: includes/class-health-check-auto-updates.php:290
+msgid "(Your site is performing updates over FTP due to file ownership. Talk to your hosting company.)"
+msgstr "(Din webbplats genomför uppdateringar via FTP på grund av filernas ägare. Hör med ditt webbhotell.)"
+
+#: includes/class-health-check-auto-updates.php:289
+msgid "Your installation of WordPress prompts for FTP credentials to perform updates."
+msgstr "Din WordPress-installation ber om inloggningsuppgifter för FTP för att genomföra uppdateringar."
+
+#: includes/class-health-check-auto-updates.php:272
+msgid "No version control systems were detected."
+msgstr "Inget system för versionshantering har upptäckts."
+
+#. translators: 1: Folder name. 2: Version control directory.
+#: includes/class-health-check-auto-updates.php:263
+msgid "The folder %1$s was detected as being under version control (%2$s)."
+msgstr "Katalogen %1$s verkar kontrolleras av versionshantering (%2$s)."
+
+#. translators: 1: Folder name. 2: Version control directory. 3: Filter name.
+#: includes/class-health-check-auto-updates.php:250
+msgid "The folder %1$s was detected as being under version control (%2$s), but the %3$s filter is allowing updates."
+msgstr "Katalogen %1$s verkar kontrolleras av versionshantering (%2$s), men filtret %3$s möjliggör uppdateringar."
+
+#: includes/class-health-check-auto-updates.php:196
+msgid "We'll try again with the next release."
+msgstr "Vi kommer att försöka igen med nästa utgåva."
+
+#: includes/class-health-check-auto-updates.php:191
+msgid "A previous automatic background update could not occur."
+msgstr "En tidigare automatisk bakgrundsuppdatering kunde inte genomföras."
+
+#. translators: %s: Code of error shown.
+#: includes/class-health-check-auto-updates.php:182
+#: includes/class-health-check-auto-updates.php:199
+msgid "The error code was %s."
+msgstr "Felkoden var %s."
+
+#: includes/class-health-check-auto-updates.php:179
+msgid "When you've been able to update using the \"Update Now\" button on Dashboard > Updates, we'll clear this error for future update attempts."
+msgstr "När du har lyckats uppdatera den med hjälp av knappen ”Uppdatera nu” under Panel > Uppdateringar kommer vi att återställa detta fel för att sedan åter försöka uppdatera automatiskt."
+
+#: includes/class-health-check-auto-updates.php:178
+#: includes/class-health-check-auto-updates.php:193
+msgid "You would have received an email because of this."
+msgstr "Du bör ha fått ett e-postmeddelande om detta."
+
+#: includes/class-health-check-auto-updates.php:177
+msgid "A previous automatic background update ended with a critical failure, so updates are now disabled."
+msgstr "En tidigare automatisk bakgrundsuppdatering ledde till ett kritiskt fel. Därför är uppdateringarna nu inaktiverade."
+
+#. translators: %s: Name of the filter used.
+#: includes/class-health-check-auto-updates.php:154
+msgid "The %s filter is enabled."
+msgstr "Filtret %s är aktiverat."
+
+#. translators: %s: Name of the filter used.
+#: includes/class-health-check-auto-updates.php:134
+msgid "A plugin has prevented updates by disabling %s."
+msgstr "Ett tillägg har förhindrat uppdateringar genom att inaktivera %s."
+
+#. translators: %s: Name of the constant used.
+#: includes/class-health-check-auto-updates.php:77
+msgid "The %s constant is defined and enabled."
+msgstr "Konstanten %s är definierad och aktiv."
+
+#. Author of the plugin
+msgid "The WordPress.org community"
+msgstr "WordPress.org-gemenskapen"
+
+#. Description of the plugin
+msgid "Checks the health of your WordPress install."
+msgstr "Kontrollerar hälsan hos din WordPress-installation."
+
+#. Plugin URI of the plugin
+#. Author URI of the plugin
+msgid "https://wordpress.org/plugins/health-check/"
+msgstr "https://sv.wordpress.org/plugins/health-check/"
+
+#: pages/phpinfo.php:32
+msgid "Some scenarios require you to look up more detailed server configurations than what is normally required. This page allows you to view all available configuration options for your PHP setup. Please be advised that WordPress does not guarantee that any information shown on this page may not be considered private."
+msgstr "Vissa scenarier kräver att du kontrollerar mer detaljerad information om serverkonfigurationen än vad som normalt behövs. Denna sida låter dig se alla tillgängliga konfigurationsalternativ för din PHP-konfiguration. Ha i åtanke att WordPress inte kan garantera att det inte finns någon känslig privat information på denna sida."
+
+#: pages/phpinfo.php:24
+msgid "The phpinfo() function has been disabled by your host. Please contact the host if you need more information about your setup."
+msgstr "Ditt webbhotell har inaktiverat funktionen phpinfo(). Kontakta webbhotellet om du behöver mer information om serverkonfigurationen."
+
+#: includes/class-health-check-site-status.php:1912
+msgid "HTTPS status"
+msgstr "HTTPS-status"
+
+#: includes/class-health-check-site-status.php:1087
+msgid "Your MariaDB version supports utf8mb4."
+msgstr "Din version av MariaDB har stöd för utf8mb4."
+
+#: includes/class-health-check-site-status.php:1067
+msgid "Your MySQL version supports utf8mb4."
+msgstr "Din version av MySQL har stöd för utf8mb4."
+
+#: includes/class-health-check-site-status.php:1908
+msgid "MySQL utf8mb4 support"
+msgstr "Stöd för MySQL utf8mb4"
+
+#: pages/site-status.php:35
+msgid "The site health check shows critical information about your WordPress configuration and items that require your attention."
+msgstr "Hälsokontrollen för webbplatsen visar avgörande information om konfigurationen av din WordPress-webbplats och saker du behöver uppmärksamma."
+
+#. translators: 1: Parent theme name. 2: Parent theme slug.
+#. translators: 1: Theme name. 2: Theme slug.
+#: includes/class-health-check-debug-data.php:923
+#: includes/class-health-check-debug-data.php:981
+#: includes/class-health-check-debug-data.php:1062
+msgid "%1$s (%2$s)"
+msgstr "%1$s (%2$s)"
+
+#: includes/class-health-check-debug-data.php:945
+msgid "Parent theme"
+msgstr "Överordnat tema"
+
+#: includes/class-health-check-debug-data.php:940
+#: includes/class-health-check-debug-data.php:998
+msgid "Author website"
+msgstr "Författarens webbplats"
+
+#: includes/class-health-check-debug-data.php:935
+#: includes/class-health-check-debug-data.php:993
+msgid "Author"
+msgstr "Författare"
+
+#: includes/class-health-check-debug-data.php:920
+#: includes/class-health-check-debug-data.php:978
+msgid "Name"
+msgstr "Namn"
+
+#. translators: 1: Plugin version number. 2: Plugin author name.
+#. translators: 1: Theme version number. 2: Theme author name.
+#: includes/class-health-check-debug-data.php:824
+#: includes/class-health-check-debug-data.php:862
+#: includes/class-health-check-debug-data.php:1036
+msgid "Version %1$s by %2$s"
+msgstr "Version %1$s av %2$s"
+
+#: includes/class-health-check-debug-data.php:807
+msgid "Database prefix"
+msgstr "Databas-prefix"
+
+#: includes/class-health-check-debug-data.php:795
+msgid "Database host"
+msgstr "Databasvärd"
+
+#: includes/class-health-check-debug-data.php:789
+msgid "Database user"
+msgstr "Databasanvändare"
+
+#: includes/class-health-check-debug-data.php:784
+msgid "Client version"
+msgstr "Klientversion"
+
+#: includes/class-health-check-debug-data.php:779
+msgid "Server version"
+msgstr "Serverversion"
+
+#: includes/class-health-check-debug-data.php:774
+msgid "Extension"
+msgstr "Tillägg"
+
+#: includes/class-health-check-debug-data.php:700
+msgid "Is the Imagick library available?"
+msgstr "Är biblioteket Imagick tillgängligt?"
+
+#: includes/class-health-check-debug-data.php:667
+msgid "PHP post max size"
+msgstr "Största storlek för PHP post"
+
+#: includes/class-health-check-debug-data.php:663
+msgid "Upload max filesize"
+msgstr "Max filstorlek för filuppladdning"
+
+#: includes/class-health-check-debug-data.php:655
+msgid "PHP memory limit"
+msgstr "PHP-minnesgräns"
+
+#: includes/class-health-check-debug-data.php:651
+msgid "PHP time limit"
+msgstr "PHP-tidsgräns"
+
+#: includes/class-health-check-debug-data.php:647
+msgid "PHP max input variables"
+msgstr "Maxvärden för PHP inmatning"
+
+#: includes/class-health-check-debug-data.php:642
+msgid "Unable to determine some settings, as the ini_get() function has been disabled."
+msgstr "Vissa inställningar gick inte att undersöka eftersom funktionen ini_get() är inaktiverad."
+
+#: includes/class-health-check-debug-data.php:641
+msgid "Server settings"
+msgstr "Serverinställningar"
+
+#: includes/class-health-check-debug-data.php:634
+msgid "Unable to determine PHP SAPI"
+msgstr "Det går inte att avgöra PHP SAPI"
+
+#: includes/class-health-check-debug-data.php:633
+msgid "PHP SAPI"
+msgstr "PHP SAPI"
+
+#: includes/class-health-check-debug-data.php:591
+msgid "Unable to determine PHP version"
+msgstr "Det går inte att avgöra PHP-versionen"
+
+#: includes/class-health-check-site-status.php:1896
+msgid "PHP Version"
+msgstr "PHP-version"
+
+#: includes/class-health-check-debug-data.php:613
+msgid "Unable to determine server architecture"
+msgstr "Det går inte att avgöra serverarkitekturen"
+
+#: includes/class-health-check-debug-data.php:612
+msgid "Server architecture"
+msgstr "Server-arkitektur"
+
+#. translators: 1: The IP address WordPress.org resolves to. 2: The error
+#. returned by the lookup.
+#: includes/class-health-check-debug-data.php:404
+msgid "Unable to reach WordPress.org at %1$s: %2$s"
+msgstr "Det går inte att nå WordPress.org på %1$s: %2$s"
+
+#: includes/class-health-check-debug-data.php:396
+msgid "WordPress.org is reachable"
+msgstr "WordPress.org är nåbar"
+
+#: includes/class-health-check-site-status.php:1938
+#: includes/class-health-check-debug-data.php:395
+#: includes/class-health-check-debug-data.php:401
+msgid "Communication with WordPress.org"
+msgstr "Kommunikation med WordPress.org"
+
+#: includes/class-health-check-debug-data.php:378
+msgid "Network count"
+msgstr "Antal nätverk"
+
+#: includes/class-health-check-debug-data.php:373
+msgid "Site count"
+msgstr "Antal webbplatser"
+
+#: includes/class-health-check-debug-data.php:368
+#: includes/class-health-check-debug-data.php:385
+msgid "User count"
+msgstr "Antal användare"
+
+#: includes/class-health-check-debug-data.php:1077
+msgid "The must use plugins directory"
+msgstr "Katalogen för obligatoriska tillägg"
+
+#: includes/class-health-check-debug-data.php:344
+msgid "The themes directory"
+msgstr "Katalogen themes"
+
+#: includes/class-health-check-debug-data.php:339
+msgid "The plugins directory"
+msgstr "Katalogen plugins"
+
+#: includes/class-health-check-debug-data.php:334
+msgid "The uploads directory"
+msgstr "Katalogen uploads"
+
+#: includes/class-health-check-debug-data.php:329
+msgid "The wp-content directory"
+msgstr "Katalogen wp-content"
+
+#: includes/class-health-check-debug-data.php:325
+#: includes/class-health-check-debug-data.php:330
+#: includes/class-health-check-debug-data.php:335
+#: includes/class-health-check-debug-data.php:340
+#: includes/class-health-check-debug-data.php:345
+#: includes/class-health-check-debug-data.php:1078
+msgid "Not writable"
+msgstr "Ej skrivbar"
+
+#: includes/class-health-check-debug-data.php:325
+#: includes/class-health-check-debug-data.php:330
+#: includes/class-health-check-debug-data.php:335
+#: includes/class-health-check-debug-data.php:340
+#: includes/class-health-check-debug-data.php:345
+#: includes/class-health-check-debug-data.php:1078
+msgid "Writable"
+msgstr "Skrivbar"
+
+#: includes/class-health-check-debug-data.php:324
+msgid "The main WordPress directory"
+msgstr "Den huvudsakliga WordPress katalogen"
+
+#: includes/class-health-check-debug-data.php:320
+msgid "Filesystem Permissions"
+msgstr "Rättigheter i filsystemet"
+
+#: includes/class-health-check-debug-data.php:190
+#: includes/class-health-check-debug-data.php:200
+#: includes/class-health-check-debug-data.php:209
+#: includes/class-health-check-debug-data.php:218
+#: includes/class-health-check-debug-data.php:227
+#: includes/class-health-check-debug-data.php:267
+#: includes/class-health-check-debug-data.php:272
+#: includes/class-health-check-debug-data.php:282
+#: includes/class-health-check-debug-data.php:287
+msgid "Disabled"
+msgstr "Inaktiverat"
+
+#: includes/class-health-check-debug-data.php:195
+#: includes/class-health-check-debug-data.php:200
+#: includes/class-health-check-debug-data.php:209
+#: includes/class-health-check-debug-data.php:218
+#: includes/class-health-check-debug-data.php:227
+#: includes/class-health-check-debug-data.php:267
+#: includes/class-health-check-debug-data.php:272
+#: includes/class-health-check-debug-data.php:282
+#: includes/class-health-check-debug-data.php:287
+msgid "Enabled"
+msgstr "Aktiverat"
+
+#: includes/class-health-check-debug-data.php:203
+#: includes/class-health-check-debug-data.php:212
+#: includes/class-health-check-debug-data.php:221
+#: includes/class-health-check-debug-data.php:230
+#: includes/class-health-check-debug-data.php:245
+#: includes/class-health-check-debug-data.php:250
+#: includes/class-health-check-debug-data.php:941
+#: includes/class-health-check-debug-data.php:999
+msgid "Undefined"
+msgstr "Odefinierat"
+
+#: includes/class-health-check-debug-data.php:235
+msgid "WordPress Constants"
+msgstr "WordPress-konstanter"
+
+#: includes/class-health-check-debug-data.php:185
+msgid "Database"
+msgstr "Databas"
+
+#: includes/class-health-check-debug-data.php:180
+msgid "The options shown below relate to your server setup. If changes are required, you may need your web host’s assistance."
+msgstr "Alternativen som visas nedan avser din serverkonfiguration.Om något behöver ändras kan du behöva hjälp från ditt webbhotell."
+
+#: includes/class-health-check-debug-data.php:179
+msgid "Server"
+msgstr "Server"
+
+#: includes/class-health-check-debug-data.php:168
+msgid "Inactive Plugins"
+msgstr "Inaktiva tillägg"
+
+#: includes/class-health-check-debug-data.php:162
+msgid "Active Plugins"
+msgstr "Aktiva tillägg"
+
+#: includes/class-health-check-debug-data.php:156
+msgid "Must Use Plugins"
+msgstr "Permanentaktiverade tillägg (must use)"
+
+#: includes/class-health-check-debug-data.php:140
+msgid "Active Theme"
+msgstr "Aktivt tema"
+
+#: includes/class-health-check-debug-data.php:135
+msgid "Drop-ins are single files that replace or enhance WordPress features in ways that are not possible for traditional plugins."
+msgstr "Insticksprogram är enstaka filer som ersätter eller förbättrar WordPress-funktioner på sätt som inte är möjligta för vanliga tillägg."
+
+#: includes/class-health-check-debug-data.php:133
+msgid "Drop-ins"
+msgstr "Drop-in"
+
+#: includes/class-health-check-debug-data.php:118
+msgid "Is this a multisite?"
+msgstr "Är detta en nätverksinstallation (multisite)?"
+
+#: includes/class-health-check-debug-data.php:113
+msgid "Default comment status"
+msgstr "Standardinställning för kommentarer"
+
+#: includes/class-health-check-debug-data.php:108
+msgid "Can anyone register on this site?"
+msgstr "Kan vem som helst registrera sig på denna webbplats?"
+
+#: includes/class-health-check-debug-data.php:104
+#: includes/class-health-check-debug-data.php:109
+#: includes/class-health-check-debug-data.php:119
+#: includes/class-health-check-debug-data.php:692
+#: includes/class-health-check-debug-data.php:701
+msgid "No"
+msgstr "Nej"
+
+#: includes/class-health-check-debug-data.php:104
+#: includes/class-health-check-debug-data.php:109
+#: includes/class-health-check-debug-data.php:119
+#: includes/class-health-check-debug-data.php:692
+#: includes/class-health-check-debug-data.php:701
+msgid "Yes"
+msgstr "Ja"
+
+#: includes/class-health-check-debug-data.php:103
+msgid "Is this site using HTTPS?"
+msgstr "Använder denna webbplats HTTPS?"
+
+#: includes/class-health-check-debug-data.php:98
+msgid "Permalink structure"
+msgstr "Permalänks-struktur"
+
+#: includes/class-health-check-debug-data.php:93
+msgid "Site URL"
+msgstr "Webbplatsens URL"
+
+#: includes/class-health-check-debug-data.php:88
+msgid "Home URL"
+msgstr "Startsidans URL"
+
+#: includes/tools/class-health-check-plugin-compatibility.php:24
+#: includes/class-health-check-debug-data.php:75
+#: includes/class-health-check-debug-data.php:930
+#: includes/class-health-check-debug-data.php:988
+msgid "Version"
+msgstr "Version"
+
+#: includes/class-health-check-debug-data.php:72
+msgid "WordPress"
+msgstr "WordPress"
\ No newline at end of file
diff --git a/wp-content/languages/plugins/jetpack-sv_SE-6030814ecc6554f776e6c2f913459ba8.json b/wp-content/languages/plugins/jetpack-sv_SE-6030814ecc6554f776e6c2f913459ba8.json
new file mode 100644
index 000000000..a8237344a
--- /dev/null
+++ b/wp-content/languages/plugins/jetpack-sv_SE-6030814ecc6554f776e6c2f913459ba8.json
@@ -0,0 +1 @@
+{"translation-revision-date":"2019-11-06 00:54:14+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"sv_SE"},"block search term\u0004map":["karta"],"block search term\u0004navigation":["navigering"],"Terrain":["Terr\u00e4ng"],"Satellite":["Satellit"],"Black and white":["Svart och vit"],"Basic":["Grundl\u00e4ggande"],"Delete Marker":["Ta bort mark\u00f6r"],"Add an interactive map showing one or more locations.":["L\u00e4gg till en interaktiv karta som visar en eller flera platser."],"block search term\u0004location":["plats"],"Marker Caption":["Tidsmark\u00f6rstext"],"Marker Title":["Tidsmark\u00f6rstitel"],"Map":["Karta"]}},"comment":{"reference":"_inc\/blocks\/map\/view.js"}}
\ No newline at end of file
diff --git a/wp-content/languages/plugins/jetpack-sv_SE-e48297939dadcf2a16dec6bb472204f5.json b/wp-content/languages/plugins/jetpack-sv_SE-e48297939dadcf2a16dec6bb472204f5.json
new file mode 100644
index 000000000..8ec5f502a
--- /dev/null
+++ b/wp-content/languages/plugins/jetpack-sv_SE-e48297939dadcf2a16dec6bb472204f5.json
@@ -0,0 +1 @@
+{"translation-revision-date":"2019-11-06 00:54:14+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"sv_SE"},"View my plan":["Visa mitt paket"],"Congratulations! Your site is now on a paid plan.":["Grattis! Din webbplats har nu ett betalt paket."],"Congratulations! Your site is now on the %s plan.":["Grattis! Din webbplats har nu %s-paketet."],"This block will only appear to a visitor who visited the page three or more times.":["Det h\u00e4r blocket visas bara f\u00f6r bes\u00f6kare som har bes\u00f6kt sidan tre eller flera g\u00e5nger."],"Or a new one.":["Eller en ny."],"To use this block, select a previously created payment plan.":["Om du vill anv\u00e4nda detta block v\u00e4ljer du ett tidigare skapat betalningspaket. "],"To use this block, first add at least one payment plan.":["F\u00f6r att anv\u00e4nda det h\u00e4r blocket m\u00e5ste du l\u00e4gga till minst ett betalt paket."],"Add a plan":["L\u00e4gg till ett paket"],"Add this plan":["L\u00e4gg till detta paket"],"This block will be hidden from your visitors until you connect to Stripe.":["Detta block kommer att d\u00f6ljas fr\u00e5n dina bes\u00f6kare tills du ansluter till Stripe."],"Connect to Stripe to use this block on your site":["Anslut till Stripe f\u00f6r att anv\u00e4nda det h\u00e4r blocket p\u00e5 din webbplats"],"Markdown is a text formatting syntax that is converted into HTML. You can _emphasize_ text or **make it strong** with just a few characters.":["Markdown \u00e4r en textformateringssyntax som konverteras till HTML. Du kan _betona_ text eller **g\u00f6ra den stark** med bara n\u00e5gra f\u00e5 tecken."],"Try Markdown":["Prova markdown"],"Image Size":["Bildstorlek"],"Image Settings":["Bildinst\u00e4llningar"],"Map Preview":["F\u00f6rhandsgranskning av karta"],"Confirmation Message":["Bekr\u00e4ftelsemeddelande"],"Redirect Address":["Omdirigera adress"],"Message Text":["Meddelandetext"],"Redirect to another webpage":["Omdirigera till en annan webbsida"],"Show a custom text message":["Visa ett anpassat textmeddelande"],"Show a summary of submitted fields":["Visa en sammanfattning av skickade f\u00e4lt"],"On Submission":["Vid ins\u00e4ndning"],"Take flight in ultimate comfort with ths stylish t-shirt featuring the Jetpack logo.":["Pr\u00f6va vingarna i ultimat komfort med den h\u00e4r l\u00e4ckra t-shirten med Jetpack-logotypen."],"Jetpack t-shirt":["Jetpack t-shirt"],"Serves images using Jetpack's fast global network of servers.":["Servar bilder med hj\u00e4lp av Jetpacks snabba globala n\u00e4tverk av servrar."],"Thank you for your submission!":["Tack f\u00f6r ditt bidrag!"],"You cancelled connecting your site to Stripe.":["Du avbr\u00f6t anslutningen av din webbplats till Stripe."],"Congrats! Your site is now connected to Stripe. You can start making money by adding your first subscription!":["Grattis! Din webbplats \u00e4r nu ansluten till Stripe. Du kan b\u00f6rja tj\u00e4na pengar genom att l\u00e4gga till din f\u00f6rsta prenumeration!"],"Generating preview\u2026":["Genererar f\u00f6rhandsgranskning\u2026"],"Remove Poster Image":["Ta bort posterbild"],"There is no poster image currently selected":["Det finns ingen vald posterbild f\u00f6r tillf\u00e4llet."],"The current poster image url is %s":["Den aktuella webbadressen f\u00f6r posterbild \u00e4r %s"],"Replace image":["Ers\u00e4tt bild"],"Select Poster Image":["V\u00e4lj bildposter"],"Poster Image":["Posterbild"],"VideoPress preload setting\u0004None":["Ingen"],"VideoPress preload setting\u0004Metadata":["Meta-data"],"VideoPress preload setting\u0004Auto":["Auto"],"Preload":["F\u00f6rhandsladda"],"Playback Controls":["Uppspelningsreglage"],"Muted":["Tystad"],"Loop":["Loop"],"Video Settings":["Videoinst\u00e4llningar"],"Note: Autoplaying videos may cause usability issues for some visitors.":["Obs! Automatisk uppspelning av videoklipp kan f\u00f6rsv\u00e5ra anv\u00e4ndningen f\u00f6r vissa bes\u00f6kare."],"Upgrade to a paid plan to use this block on your site.":["Uppgradera till ett betalt paket f\u00f6r att anv\u00e4nda detta block p\u00e5 din webbplats."],"Upgrade to %(planName)s to use this block on your site.":["Uppgradera till %(planName)s f\u00f6r att anv\u00e4nda det h\u00e4r blocket p\u00e5 din webbplats."],"You can try it out before upgrading, but only you will see it. It will be hidden from your visitors until you upgrade.":["Du kan prova det innan du uppgraderar men bara du ser det. Det kommer att d\u00f6ljas fr\u00e5n dina bes\u00f6kare tills du uppgraderar."],"Upgrade Your Plan":["Uppgradera ditt paket"],"Recurring Payments button":["\u00c5terkommande betalningar-knappen"],"See your earnings, subscriber list, and products.":["Se dina int\u00e4kter, din prenumerantlista och dina produkter."],"%s \/ %s":["%s \/ %s"],"%s \/ year":["%s\/\u00e5r"],"%s \/ month":["%s\/m\u00e5nad"],"You'll need to upgrade your plan to use the Recurring Payments button.":["Du m\u00e5ste uppgradera ditt paket f\u00f6r att anv\u00e4nda \u00c5terkommande betalningar-knappen."],"Recurring Payments":["\u00c5terkommande betalningar"],"Management":["Hantering"],"Payment plan":["Betalningsplan"],"Read more about Recurring Payments and related fees.":["L\u00e4s mer om \u00e5terkommande betalningar och relaterade avgifter."],"block search term\u0004Connected":["Ansluten"],"block search term\u0004Linked":["L\u00e4nkad"],"block search term\u0004subscription":["prenumeration"]," Contribution":[" Bidrag"],"Yearly":["\u00c5rligen"],"Monthly":["M\u00e5nadsvis"],"Renew interval":["F\u00f6rnya intervall"],"Subscription description":["Prenumerationsbeskrivning"],"Describe your subscription in a few words":["Beskriv din prenumeration med n\u00e5gra f\u00e5 ord"],"Button allowing you to sell subscription products.":["Knapp som g\u00f6r det m\u00f6jligt att s\u00e4lja prenumerationsprodukter"],"block search term\u0004newsletter":["nyhetsbrev"],"Write a description\u2026":["Skriv en beskrivning\u2026"],"block search term\u0004Similar content":["Liknande inneh\u00e5ll"],"SEO Description":["SEO-beskrivning"],"%d character":["%d tecken","%d tecken"],"Preview unavailable: you haven't published enough posts with similar content.":["F\u00f6rhandsvisning ej tillg\u00e4nglig: du har inte publicerat tillr\u00e4ckligt m\u00e5nga inl\u00e4gg med liknande inneh\u00e5ll."],"A form enabling readers to join a Mailchimp list.":["Ett formul\u00e4r som g\u00f6r det m\u00f6jligt f\u00f6r l\u00e4sare att g\u00e5 med i en Mailchimp-lista"],"Write consent text":["Skriv text om samtycke"],"You can edit the email placeholder in the sidebar.":["Du kan redigera e-postens platsh\u00e5llare i sidopanelen."],"Manage Connection":["Hantera anslutning"],"Mailchimp Connection":["Mailchimp-anslutning"],"Error text":["Feltext"],"Success text":["Lyckades-text"],"Processing text":["Bearbetar text"],"Email Placeholder":["E-postplatsh\u00e5llare"],"Text Elements":["Textelement"],"Re-check Connection":["Kontrollera anslutningen igen"],"Icon for image":["Ikon f\u00f6r bild"],"Grey square":["Gr\u00e5 fyrkant"],"Shortlink":["Kortl\u00e4nk"],"In \u201cUncategorized\u201d":["I \u201dOkategoriserad\u201d"],"August 3, 2018":["3 augusti 2018"],"Placeholder image":["Platsh\u00e5llarbild"],"Set up Mailchimp form":["St\u00e4ll in Mailchimp-formul\u00e4r"],"You need to connect your Mailchimp account and choose a list in order to start collecting Email subscribers.":["Du m\u00e5ste ansluta ditt Mailchimp-konto och v\u00e4lja en lista f\u00f6r att b\u00f6rja samla e-postprenumeranter."],"Display thumbnails":["Visa miniatyrer"],"List View":["Listvy"],"Grid View":["Rutn\u00e4tsvy"],"Number of posts":["Antal inl\u00e4gg"],"Related Posts Settings":["Inst\u00e4llningar f\u00f6r relaterade inl\u00e4gg"],"Display context (category or tag)":["Visa kontext (kategori eller etikett)"],"block search term\u0004markup":["kodredigering"],"block search term\u0004syntax":["syntax"],"block search term\u0004giphy":["giphy"],"block search term\u0004visitors":["bes\u00f6kare"],"block search term\u0004return":["\u00e5terv\u00e4nd"],"block search term\u0004image":["bild"],"block search term\u0004formatting":["formatering"],"block search term\u0004follow":["f\u00f6lj"],"block search term\u0004subscribe":["prenumerera"],"block search term\u0004animated":["animerad"],"Mailchimp":["Mailchimp"],"block search term\u0004visibility":["synlighet"],"Control block visibility based on how often a visitor has viewed the page.":["Kontrollblockets synlighet baserat p\u00e5 hur ofta en bes\u00f6kare har tittat p\u00e5 sidan."],"Please enter a valid number.":["V\u00e4nligen ange ett giltigt nummer."],"Advertisement":["Annons"],"Learn all about WordAds":["L\u00e4r dig allt om WordAds"],"Earn income by adding high quality ads to your post":["Tj\u00e4na pengar genom att l\u00e4gga till annonser av h\u00f6g kvalitet till ditt inl\u00e4gg"],"Hide ad on mobile views":["D\u00f6lj annons i mobila vyer"],"business is closed on a full day\u0004Closed":["St\u00e4ngd"],"block search term\u0004schedule":["tidsinst\u00e4ll"],"block search term\u0004closing time":["st\u00e4ngningstid"],"block search term\u0004opening hours":["\u00f6ppettider"],"Add an interactive slideshow.":["L\u00e4gg till ett interaktivt bildspel."],"Visit count threshold":["Bes\u00f6ksantalsgr\u00e4ns"],"Repeat Visitor":["\u00c5terkommande bes\u00f6kare"],"This block will only appear to people who have visited this page more than once.":["Detta block visas bara f\u00f6r personer som har bes\u00f6kt sidan minst en g\u00e5ng tidigare.","Detta block visas bara f\u00f6r personer som har bes\u00f6kt sidan minst %d g\u00e5nger tidigare."],"Show after threshold":["Visa efter gr\u00e4ns"],"Show before threshold":["Visa f\u00f6re gr\u00e4ns"],"This block will only appear to people who are visiting this page for the first time.":["Detta block visas bara f\u00f6r personer som bes\u00f6ker denna sida f\u00f6r f\u00f6rsta g\u00e5ngen.","Detta block kommer bara att visas f\u00f6r personer som har bes\u00f6kt denna sida h\u00f6gst %d g\u00e5nger."],"Effects":["Effekter"],"Edit Slideshow":["Redigera bildspel"],"Drag images, upload new ones or select files from your library.":["Dra bilder, ladda upp nya eller v\u00e4lj filer fr\u00e5n ditt bibliotek."],"Pick an ad format":["V\u00e4lj ett annonsformat"],"Rectangle 300x250":["Rektangel 300x250"],"Wide Skyscraper 160x600":["Bred Skyscraper 160x600"],"Mobile Leaderboard 320x50":["Mobil Leaderboard 320x50"],"Leaderboard 728x90":["Rankningslista 728x90"],"Edit video":["Redigera video"],"Uploading\u2026":["Laddar upp ..."],"Transition effect":["\u00d6verg\u00e5ngseffekt"],"The Reduce Motion accessibility option is selected, therefore autoplay will be disabled in this browser.":["Alternativet Minska r\u00f6relse\u00e5tkomst \u00e4r valt, s\u00e5 automatisk uppspelning kommer att inaktiveras i den h\u00e4r webbl\u00e4saren."],"Friday":["Fredag"],"Sunday":["S\u00f6ndag"],"Thursday":["Torsdag"],"Wednesday":["Onsdag"],"Tuesday":["Tisdag"],"Monday":["M\u00e5ndag"],"Saturday":["L\u00f6rdag"],"Add Hours":["L\u00e4gg till timmar"],"Display opening hours for your business.":["Visa \u00f6ppettider f\u00f6r ditt f\u00f6retag."],"Business Hours":["\u00d6ppettider"],"Loading business hours":["L\u00e4ser in \u00f6ppettider"],"Closing":["St\u00e4nger"],"Opening":["\u00d6ppnar"],"Open":["\u00d6ppen"],"Subscriber count unavailable":["Prenumerantantal \u00e4r inte tillg\u00e4ngligt"],"Show total subscribers":["Visa totalt antal prenumeranter"],"Search for and insert an animated image.":["S\u00f6k efter och infoga en animerad bild."],"ads":["annonser"],"Ad":["Annons"],"GIF":["GIF"],"Write caption\u2026":["Skriv bildtext\u2026"],"Search for a term or paste a Giphy URL":["S\u00f6k efter en term eller klistra in en Giphy-URL"],"block search term\u0004gallery":["galleri"],"block search term\u0004slider":["slider"],"block search term\u0004join":["g\u00e5 med"],"A form enabling readers to get notifications when new posts are published from this site.":["Ett formul\u00e4r som l\u00e5ter l\u00e4sare f\u00e5 meddelanden n\u00e4r nya webbplatsen publicerar nya inl\u00e4gg."],"Subscription Form":["Prenumerationsformul\u00e4r"],"Are you sure you wish to leave this page?":["\u00c4r du s\u00e4ker p\u00e5 att du vill l\u00e4mna denna sida?"],"Use regular characters and punctuation to style text, links, and lists.":["Anv\u00e4nd vanliga tecken och skiljetecken f\u00f6r att skriva text, l\u00e4nkar och listor."],"Write your _Markdown_ **here**\u2026":["Skriv din _Markdown_ **h\u00e4r**\u2026"],"block search term\u0004sell":["s\u00e4lj"],"block search term\u0004shop":["butik"],"Delay between transitions (in seconds)":["F\u00f6rdr\u00f6jning mellan \u00f6verg\u00e5ngar (i sekunder)"],"The Swiper library could not be loaded.":["Swiper-biblioteket kunde inte h\u00e4mtas."],"Lets you create and embed credit and debit card payment buttons with minimal setup.":["L\u00e5ter dig skapa och b\u00e4dda in knappar f\u00f6r betalning med kredit- och betalkort med minimal konfiguration."],"Create one on PayPal":["Skapa en p\u00e5 PayPal"],"Enter the email address associated with your PayPal account. Don\u2019t have an account?":["Ange e-postadressen som \u00e4r kopplad till ditt PayPal-konto. Har du inget konto?"],"Slideshow transition effect\u0004Fade":["Tona"],"Slideshow transition effect\u0004Slide":["Bild"],"Autoplay":["Spela upp automatiskt"],"Autoplay between slides":["Automatisk uppspelning mellan bilder"],"Simple Payments button":["Enkel betalningsknapp"],"Support reference":["Supportreferens"],"Describe your item in a few words":["Beskriv ditt objekt med n\u00e5gra ord"],"Invalid price.":["Ogiltigt pris."],"Currency":["Valuta"],"Allow people to buy more than one item at a time":["L\u00e5t folk k\u00f6pa mer \u00e4n en sak \u00e5t g\u00e5ngen."],"Item name":["Objektnamn"],"Please add a brief title so that people know what they\u2019re paying for.":["L\u00e4gg till en kort rubrik s\u00e5 att folk vet vad de betalar f\u00f6r."],"If you\u2019re selling something, you need a price tag. Add yours here.":["Om du s\u00e4ljer n\u00e5got beh\u00f6ver du en prislapp. L\u00e4gg till din h\u00e4r."],"We know every penny counts, but prices in this currency can\u2019t contain decimal values.":["Vi vet att varje \u00f6re r\u00e4knas, men priserna i den h\u00e4r valutan kan inte inneh\u00e5lla decimaler."],"The price cannot have more than %d decimal place.":["Priset kan inte ha mer \u00e4n %d decimal.","Priset kan inte ha mer \u00e4n %d decimaler."],"Your price is negative \u2014 enter a positive number so people can pay the right amount.":["Ditt pris \u00e4r negativt \u2014 ange ett positivt v\u00e4rde s\u00e5 att folk kan betala r\u00e4tt summa."],"Add a marker\u2026":["L\u00e4gg till en mark\u00f6r\u2026"],"Edit Image":["Redigera bild"],"Product Image":["Produktbild"],"Choose":["V\u00e4lj"],"Confirm":["Bekr\u00e4fta"],"Choose Multiple":["V\u00e4lj flera"],"Accept":["Acceptera"],"Compact, but powerful. Add a select box with several items.":["Kompakt, men kraftfullt. L\u00e4gg till en valruta med flera objekt."],"Dropdown":["Rullgardinsmeny"],"Select":["V\u00e4lj"],"People love options. Add several checkbox items.":["Folk \u00e4lskar alternativ. L\u00e4gg till flera kryssruteobjekt."],"Checkbox Group":["Kryssrutegrupp"],"Add a single checkbox.":["L\u00e4gg till en enstaka kryssruta."],"Let folks speak their mind. This text box is great for longer responses.":["L\u00e5t folk s\u00e4ga vad de tycker. Den h\u00e4r textrutan \u00e4r bra f\u00f6r l\u00e4ngre svar."],"Inspired by radios, only one radio item can be selected at a time. Add several radio button items.":["Med inspiration fr\u00e5n radion, man kan bara v\u00e4lja ett radioobjekt \u00e5t g\u00e5ngen. L\u00e4gg till flera radioknappsobjekt."],"No results.":["Inga resultat."],"Colors":["F\u00e4rger"],"Show street names":["Visa gatunamn"],"Map Theme":["Karttema"],"Add a location":["L\u00e4gg till en plats"],"Add marker":["L\u00e4gg till mark\u00f6r"],"Markers":["Mark\u00f6rer"],"%d result found, use up and down arrow keys to navigate.":["%d resultat hittades, anv\u00e4nd upp och nedpilarna f\u00f6r att navigera.","%d resultat hittades, anv\u00e4nd upp och nedpilarna f\u00f6r att navigera."],"Create an account or log in to Mapbox.":["Skapa ett konto eller logga in p\u00e5 Mapbox."],"Set Token":["Ange token"],"Paste Token Here":["Klistra in token h\u00e4r"],"Locate and copy the default access token. Then, paste it into the field below.":["Identifiera och kopiera \u00e5tkomsttoken. Klistra sedan in den i nedanst\u00e5ende f\u00e4lt."],"To use the map block, you need an Access Token.":["Du beh\u00f6ver en \u00e5tkomsttoken f\u00f6r att anv\u00e4nda kartblock."],"Remove Token":["Ta bort token"],"Update Token":["Uppdatera token"],"Mapbox Access Token":["\u00c5tkomsttoken f\u00f6r Mapbox"],"Pay with PayPal":["Betala med PayPal"],"block search term\u0004contact":["kontakt"],"block search term\u0004feedback":["feedback"],"Telephone":["Telefon"],"Mobile":["Mobil"],"Cellular phone":["Mobiltelefon"],"Calendar":["Kalender"],"Date Picker":["Datumv\u00e4ljare"],"The best way to set a date. Add a date picker.":["Det b\u00e4sta s\u00e4ttet att st\u00e4lla in ett datum. L\u00e4gg till en datumv\u00e4ljare."],"day month year":["dag m\u00e5nad \u00e5r"],"Multiline text":["Text med flera rader"],"Add a phone number input.":["L\u00e4gg till en inmatning f\u00f6r telefonnummer."],"Add an address input for a website.":["L\u00e4gg till en adressinmatning f\u00f6r en webbplats."],"internet page":["internetsida"],"Want to reply to folks? Add an email address input.":["Vill du kunna svara p\u00e5 folks kommentarer? L\u00e4gg till en e-postadressinmatning."],"mail":["E-post"],"A simple way to get feedback from folks visiting your site.":["Ett enkelt s\u00e4tt att f\u00e5 \u00e5terkoppling fr\u00e5n folk som bes\u00f6ker din webbplats."],"Introductions are important. Add an input for folks to add their name.":["Introduktioner \u00e4r viktiga. L\u00e4gg till en inmatning d\u00e4r folk kan l\u00e4gga till sitt namn."],"When you need just a small amount of text, add a text input.":["N\u00e4r du bara beh\u00f6ver en liten textm\u00e4ngd, l\u00e4gg till en textimatning."],"%s is not a valid email address.":["%s \u00e4r inte en giltig e-postadress."],"Default Checked State":["Markerat standardtillst\u00e5nd"],"ID":["ID"],"Default Value":["Standardv\u00e4rde"],"Add option":["L\u00e4gg till alternativ"],"Insert option":["Infoga alternativ"],"Remove option":["Ta bort alternativ"],"Write label\u2026":["Skriv etikett\u2026"],"Field Settings":["F\u00e4ltinst\u00e4llningar"],"Write option\u2026":["Skriv alternativ\u2026"],"You can enter multiple email addresses separated by commas.":["Du kan ange flera e-postadresser separerade med kommatecken."],"Required":["Obligatorisk"],"Set the placeholder text":["St\u00e4ll in platsh\u00e5llartext"],"You\u2019ll receive an email notification each time someone fills out the form. Where should it go, and what should the subject line be?":["Du kommer att f\u00e5 en e-postavisering varje g\u00e5ng n\u00e5gon fyller i formul\u00e4ret. Vart ska den skickas, och vad ska \u00e4mnesraden vara?"],"Add form":["L\u00e4gg till formul\u00e4r"],"(If you leave these blank, notifications will go to the author with the post or page title as the subject line.)":["(Om du l\u00e4mnar dessa f\u00e4lt tomma kommer aviseringar att skickas till f\u00f6rfattaren med inl\u00e4ggets eller sidans titel som \u00e4mnesrad.)"],"Email address":["E-postadress"],"name@example.com":["namn@exempel.com"],"Form":["Formul\u00e4r"],"Let's work together":["L\u00e5t oss arbeta tillsammans"],"%s and %s are not a valid email address.":["%s och %s \u00e4r inte en giltig e-postadress."],"Email subject line":["\u00c4mnesrad f\u00f6r e-post"],"%s are not a valid email address.":["%s \u00e4r inte en giltig e-postadress."],"Email Feedback Settings":["Inst\u00e4llningar f\u00f6r feedback via e-post"],"block search term\u0004photos":["foton"],"block search term\u0004address":["adress"],"block search term\u0004phone":["telefon"],"block search term\u0004message":["meddelande"],"block search term\u0004map":["karta"],"Likes and Sharing":["Gilla & Dela"],"block search term\u0004navigation":["navigering"],"image style\u0004Original":["Original"],"Pick an image filter":["V\u00e4lj ett bildfilter"],"image style\u0004Black and White":["Svart och vit"],"image style\u0004Sepia":["Sepia"],"image style\u0004Gingham":["Gingham"],"image style\u0004Clarendon":["Clarendon"],"Open address in Google Maps":["\u00d6ppna adress i Google Maps"],"Write a message for your audience here. If you leave this blank, we'll use the post title as the message.":["Skriv ett meddelande h\u00e4r f\u00f6r din publik. Om du l\u00e4mnar detta tomt anv\u00e4nder vi posttiteln som meddelandet."],"Columns":["Kolumner"],"Edit Gallery":["Redigera galleri"],"Remove Image":["Ta bort bild"],"Upload an image":["Ladda upp en bild"],"Link To":["L\u00e4nk till"],"Tiled Gallery settings":["Inst\u00e4llningar f\u00f6r mosaikgalleri"],"block search term\u0004place":["plats"],"block search term\u0004mobile":["mobil"],"block search term\u0004telephone":["telefon"],"Text Color":["Textf\u00e4rg"],"Connect an account":["Anslut ett konto"],"Add text\u2026":["L\u00e4gg till text\u2026"],"Terrain":["Terr\u00e4ng"],"Satellite":["Satellit"],"Black and white":["Svart och vit"],"Basic":["Grundl\u00e4ggande"],"Phone Number":["Telefonnummer"],"Phone number":["Telefonnummer"],"Delete Marker":["Ta bort mark\u00f6r"],"Add an interactive map showing one or more locations.":["L\u00e4gg till en interaktiv karta som visar en eller flera platser."],"block search term\u0004location":["plats"],"block search term\u0004direction":["riktning"],"Tiled gallery layout\u0004Circles":["Cirklar"],"Tiled Gallery":["Mosaikgalleri"],"Connect and select the accounts where you'd like to share your post.":["Anslut och v\u00e4lj de konton d\u00e4r du vill dela ditt inl\u00e4gg."],"Marker Caption":["Tidsmark\u00f6rstext"],"Marker Title":["Tidsmark\u00f6rstitel"],"block search term\u0004cell":["cell"],"Lets you add a phone number with an automatically generated click-to-call link.":["L\u00e5ter dig l\u00e4gga till ett telefonnummer med en automatiskt genererad samtalsl\u00e4nk."],"block search term\u0004images":["bilder"],"block search term\u0004email":["e-post"],"Tiled gallery layout\u0004Tiled columns":["kolumner sida vid sida"],"Tiled gallery layout\u0004Square tiles":["rutor sida vid sida"],"Tiled gallery layout\u0004Tiled mosaic":["mosaik sida vid sida"],"block search term\u0004pictures":["bilder"],"Display multiple images in an elegantly organized tiled layout.":["Visa flera bilder i en elegant organiserad layout."],"Button Color Settings":["Knappens f\u00e4rginst\u00e4llningar"],"Address":["Adress"],"Country":["Land"],"City":["Ort"],"Address Line 3":["Adressrad 3"],"Address Line 2":["Adressrad 2"],"Street Address":["Gatuadress"],"Link address to Google Maps":["L\u00e4nkadress till Google Maps"],"Lets you add an email address, phone number, and physical address with improved markup for better SEO results.":["L\u00e5ter dig l\u00e4gga till en e-postadress, telefonnummer och fysisk adress med f\u00f6rb\u00e4ttrad kod f\u00f6r b\u00e4ttre s\u00f6kmotorsoptimeringsresultat."],"Postal\/Zip Code":["Postnummer"],"State\/Province\/Region":["Stat\/Landskap\/Region"],"Lets you add a physical address with Schema markup.":["L\u00e5ter dig l\u00e4gga till en fysisk adress med Schema-kod."],"image %1$d of %2$d in gallery":["bild %1$d av %2$d i galleriet"],"Customize your message":["Anpassa ditt meddelande"],"Share this post":["Dela detta inl\u00e4gg"],"%d character remaining":["%d tecken \u00e5terst\u00e5r","%d tecken \u00e5terst\u00e5r"],"Lets you add an email address with an automatically generated click-to-email link.":["L\u00e5ter dig l\u00e4gga till en e-postadress med en automatiskt genererad e-postl\u00e4nk."],"Whoops! There was an error and we couldn't process your subscription. Please reload the page and try again.":["Oj d\u00e5! Det uppstod ett fel och vi kunde inte behandla din prenumeration. V\u00e4nligen ladda om sidan och f\u00f6rs\u00f6k igen."],"Success! You're on the list.":["Klart! Du \u00e4r med p\u00e5 listan."],"Processing\u2026":["Bearbetar\u2026"],"Closed":["St\u00e4ngd"],"Map":["Karta"],"By clicking submit, you agree to share your email address with the site owner and Mailchimp to receive marketing, updates, and other emails from the site owner. Use the unsubscribe link in those emails to opt out at any time.":["Genom att klicka p\u00e5 skicka in s\u00e5 g\u00e5r du med p\u00e5 att dela din e-postadress med webbplatsens \u00e4gare och Mailchimp f\u00f6r att ta emot marknadsf\u00f6ring, uppdateringar och andra e-postmeddelanden fr\u00e5n webbplatsens \u00e4gare. Du kan n\u00e4r som helst anv\u00e4nda l\u00e4nken i e-postmeddelandena f\u00f6r att s\u00e4ga upp prenumerationen."],"Enter your email":["Ange din e-postadress"],"Join my email list":["G\u00e5 med i min e-postlista"],"Phone":["Telefon"],"Go to Sharing settings":["G\u00e5 till delningsinst\u00e4llningarna"],"Your LinkedIn connection needs to be reauthenticated to continue working \u2013 head to Sharing to take care of it.":["Din LinkedIn-anslutning m\u00e5ste \u00e5terautentiseras f\u00f6r att forts\u00e4tta fungera. G\u00e5 till Delning f\u00f6r att hantera det."],"Invalid price":["Ogiltigt pris"],"We want to make sure payments reach you, so please add an email address.":["Vi vill se till att betalningar n\u00e5r dig, s\u00e5 l\u00e4gg till en e-postadress."],"Product":["Produkt"],"Display date":["Publiceringsdatum"],"Copied!":["Kopierad!"],"verb\u0004Copy":["Kopiera"],"Background Color":["Bakgrundsf\u00e4rg"],"Upgrade":["Uppgradera"],"images":["bilder"],"Attachment Page":["Sida f\u00f6r bilaga"],"Contact Info":["Kontaktuppgifter"],"Media File":["Mediafil"],"Visibility":["Synlighet"],"Join %s other subscriber":["G\u00f6r som %s annan, prenumerera du med.","G\u00f6r som %s andra, prenumerera du med."],"Submit":["Skicka"],"Subscribe":["Prenumerera"],"Slideshow":["Bildspel"],"Before you hit Publish, please refresh the following connection(s) to make sure we can Publicize your post:":["Uppdatera f\u00f6ljande anslutning(ar) innan du klickar p\u00e5 Publicera, f\u00f6r att garantera att vi kan publicera ditt inl\u00e4gg."],"Connect":["Logga in"],"Email Address":["E-postadress"],"Related Posts":["Relaterade inl\u00e4gg"],"Notifications":["Notiser"],"Markdown":["Markdown"],"Show likes.":["Visa gillningar"],"Show sharing buttons.":["Visa delningsknappar."],"Cancel":["Avbryt"],"None":["Inget"],"Preview":["F\u00f6rhandsgranska"],"Price":["Pris"],"(required)":["(m\u00e5ste anges)"],"Checkbox":["Kryssruta"],"Email":["E-post"],"Message":["Meddelande"],"Radio":["Radio"],"Text":["Text"],"Textarea":["Textomr\u00e5de"],"Website":["Webbplats"],"Name":["Namn"],"Option":["Alternativ"],"Search":["S\u00f6k"],"e-mail":["e-post"]}},"comment":{"reference":"_inc\/blocks\/editor-beta.js"}}
\ No newline at end of file
diff --git a/wp-content/languages/plugins/jetpack-sv_SE-f2b234a1eb36d7500074cd58bfbd9b1c.json b/wp-content/languages/plugins/jetpack-sv_SE-f2b234a1eb36d7500074cd58bfbd9b1c.json
new file mode 100644
index 000000000..d3d23d0f8
--- /dev/null
+++ b/wp-content/languages/plugins/jetpack-sv_SE-f2b234a1eb36d7500074cd58bfbd9b1c.json
@@ -0,0 +1 @@
+{"translation-revision-date":"2019-11-06 00:54:14+0000","generator":"GlotPress\/2.4.0-alpha","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n != 1;","lang":"sv_SE"},"View my plan":["Visa mitt paket"],"Congratulations! Your site is now on a paid plan.":["Grattis! Din webbplats har nu ett betalt paket."],"Congratulations! Your site is now on the %s plan.":["Grattis! Din webbplats har nu %s-paketet."],"This block will only appear to a visitor who visited the page three or more times.":["Det h\u00e4r blocket visas bara f\u00f6r bes\u00f6kare som har bes\u00f6kt sidan tre eller flera g\u00e5nger."],"Or a new one.":["Eller en ny."],"To use this block, select a previously created payment plan.":["Om du vill anv\u00e4nda detta block v\u00e4ljer du ett tidigare skapat betalningspaket. "],"To use this block, first add at least one payment plan.":["F\u00f6r att anv\u00e4nda det h\u00e4r blocket m\u00e5ste du l\u00e4gga till minst ett betalt paket."],"Add a plan":["L\u00e4gg till ett paket"],"Add this plan":["L\u00e4gg till detta paket"],"This block will be hidden from your visitors until you connect to Stripe.":["Detta block kommer att d\u00f6ljas fr\u00e5n dina bes\u00f6kare tills du ansluter till Stripe."],"Connect to Stripe to use this block on your site":["Anslut till Stripe f\u00f6r att anv\u00e4nda det h\u00e4r blocket p\u00e5 din webbplats"],"Markdown is a text formatting syntax that is converted into HTML. You can _emphasize_ text or **make it strong** with just a few characters.":["Markdown \u00e4r en textformateringssyntax som konverteras till HTML. Du kan _betona_ text eller **g\u00f6ra den stark** med bara n\u00e5gra f\u00e5 tecken."],"Try Markdown":["Prova markdown"],"Image Size":["Bildstorlek"],"Image Settings":["Bildinst\u00e4llningar"],"Map Preview":["F\u00f6rhandsgranskning av karta"],"Confirmation Message":["Bekr\u00e4ftelsemeddelande"],"Redirect Address":["Omdirigera adress"],"Message Text":["Meddelandetext"],"Redirect to another webpage":["Omdirigera till en annan webbsida"],"Show a custom text message":["Visa ett anpassat textmeddelande"],"Show a summary of submitted fields":["Visa en sammanfattning av skickade f\u00e4lt"],"On Submission":["Vid ins\u00e4ndning"],"Take flight in ultimate comfort with ths stylish t-shirt featuring the Jetpack logo.":["Pr\u00f6va vingarna i ultimat komfort med den h\u00e4r l\u00e4ckra t-shirten med Jetpack-logotypen."],"Jetpack t-shirt":["Jetpack t-shirt"],"Serves images using Jetpack's fast global network of servers.":["Servar bilder med hj\u00e4lp av Jetpacks snabba globala n\u00e4tverk av servrar."],"Thank you for your submission!":["Tack f\u00f6r ditt bidrag!"],"You cancelled connecting your site to Stripe.":["Du avbr\u00f6t anslutningen av din webbplats till Stripe."],"Congrats! Your site is now connected to Stripe. You can start making money by adding your first subscription!":["Grattis! Din webbplats \u00e4r nu ansluten till Stripe. Du kan b\u00f6rja tj\u00e4na pengar genom att l\u00e4gga till din f\u00f6rsta prenumeration!"],"Generating preview\u2026":["Genererar f\u00f6rhandsgranskning\u2026"],"Remove Poster Image":["Ta bort posterbild"],"There is no poster image currently selected":["Det finns ingen vald posterbild f\u00f6r tillf\u00e4llet."],"The current poster image url is %s":["Den aktuella webbadressen f\u00f6r posterbild \u00e4r %s"],"Replace image":["Ers\u00e4tt bild"],"Select Poster Image":["V\u00e4lj bildposter"],"Poster Image":["Posterbild"],"VideoPress preload setting\u0004None":["Ingen"],"VideoPress preload setting\u0004Metadata":["Meta-data"],"VideoPress preload setting\u0004Auto":["Auto"],"Preload":["F\u00f6rhandsladda"],"Playback Controls":["Uppspelningsreglage"],"Muted":["Tystad"],"Loop":["Loop"],"Video Settings":["Videoinst\u00e4llningar"],"Note: Autoplaying videos may cause usability issues for some visitors.":["Obs! Automatisk uppspelning av videoklipp kan f\u00f6rsv\u00e5ra anv\u00e4ndningen f\u00f6r vissa bes\u00f6kare."],"Upgrade to a paid plan to use this block on your site.":["Uppgradera till ett betalt paket f\u00f6r att anv\u00e4nda detta block p\u00e5 din webbplats."],"Upgrade to %(planName)s to use this block on your site.":["Uppgradera till %(planName)s f\u00f6r att anv\u00e4nda det h\u00e4r blocket p\u00e5 din webbplats."],"You can try it out before upgrading, but only you will see it. It will be hidden from your visitors until you upgrade.":["Du kan prova det innan du uppgraderar men bara du ser det. Det kommer att d\u00f6ljas fr\u00e5n dina bes\u00f6kare tills du uppgraderar."],"Upgrade Your Plan":["Uppgradera ditt paket"],"Recurring Payments button":["\u00c5terkommande betalningar-knappen"],"See your earnings, subscriber list, and products.":["Se dina int\u00e4kter, din prenumerantlista och dina produkter."],"%s \/ %s":["%s \/ %s"],"%s \/ year":["%s\/\u00e5r"],"%s \/ month":["%s\/m\u00e5nad"],"You'll need to upgrade your plan to use the Recurring Payments button.":["Du m\u00e5ste uppgradera ditt paket f\u00f6r att anv\u00e4nda \u00c5terkommande betalningar-knappen."],"Recurring Payments":["\u00c5terkommande betalningar"],"Management":["Hantering"],"Payment plan":["Betalningsplan"],"Read more about Recurring Payments and related fees.":["L\u00e4s mer om \u00e5terkommande betalningar och relaterade avgifter."],"block search term\u0004Connected":["Ansluten"],"block search term\u0004Linked":["L\u00e4nkad"],"block search term\u0004subscription":["prenumeration"]," Contribution":[" Bidrag"],"Yearly":["\u00c5rligen"],"Monthly":["M\u00e5nadsvis"],"Renew interval":["F\u00f6rnya intervall"],"Subscription description":["Prenumerationsbeskrivning"],"Describe your subscription in a few words":["Beskriv din prenumeration med n\u00e5gra f\u00e5 ord"],"Button allowing you to sell subscription products.":["Knapp som g\u00f6r det m\u00f6jligt att s\u00e4lja prenumerationsprodukter"],"block search term\u0004newsletter":["nyhetsbrev"],"block search term\u0004Similar content":["Liknande inneh\u00e5ll"],"Preview unavailable: you haven't published enough posts with similar content.":["F\u00f6rhandsvisning ej tillg\u00e4nglig: du har inte publicerat tillr\u00e4ckligt m\u00e5nga inl\u00e4gg med liknande inneh\u00e5ll."],"A form enabling readers to join a Mailchimp list.":["Ett formul\u00e4r som g\u00f6r det m\u00f6jligt f\u00f6r l\u00e4sare att g\u00e5 med i en Mailchimp-lista"],"Write consent text":["Skriv text om samtycke"],"You can edit the email placeholder in the sidebar.":["Du kan redigera e-postens platsh\u00e5llare i sidopanelen."],"Manage Connection":["Hantera anslutning"],"Mailchimp Connection":["Mailchimp-anslutning"],"Error text":["Feltext"],"Success text":["Lyckades-text"],"Processing text":["Bearbetar text"],"Email Placeholder":["E-postplatsh\u00e5llare"],"Text Elements":["Textelement"],"Re-check Connection":["Kontrollera anslutningen igen"],"Icon for image":["Ikon f\u00f6r bild"],"Grey square":["Gr\u00e5 fyrkant"],"Shortlink":["Kortl\u00e4nk"],"In \u201cUncategorized\u201d":["I \u201dOkategoriserad\u201d"],"August 3, 2018":["3 augusti 2018"],"Placeholder image":["Platsh\u00e5llarbild"],"Set up Mailchimp form":["St\u00e4ll in Mailchimp-formul\u00e4r"],"You need to connect your Mailchimp account and choose a list in order to start collecting Email subscribers.":["Du m\u00e5ste ansluta ditt Mailchimp-konto och v\u00e4lja en lista f\u00f6r att b\u00f6rja samla e-postprenumeranter."],"Display thumbnails":["Visa miniatyrer"],"List View":["Listvy"],"Grid View":["Rutn\u00e4tsvy"],"Number of posts":["Antal inl\u00e4gg"],"Related Posts Settings":["Inst\u00e4llningar f\u00f6r relaterade inl\u00e4gg"],"Display context (category or tag)":["Visa kontext (kategori eller etikett)"],"block search term\u0004markup":["kodredigering"],"block search term\u0004syntax":["syntax"],"block search term\u0004giphy":["giphy"],"block search term\u0004visitors":["bes\u00f6kare"],"block search term\u0004return":["\u00e5terv\u00e4nd"],"block search term\u0004image":["bild"],"block search term\u0004formatting":["formatering"],"block search term\u0004follow":["f\u00f6lj"],"block search term\u0004subscribe":["prenumerera"],"block search term\u0004animated":["animerad"],"Mailchimp":["Mailchimp"],"block search term\u0004visibility":["synlighet"],"Control block visibility based on how often a visitor has viewed the page.":["Kontrollblockets synlighet baserat p\u00e5 hur ofta en bes\u00f6kare har tittat p\u00e5 sidan."],"Please enter a valid number.":["V\u00e4nligen ange ett giltigt nummer."],"Advertisement":["Annons"],"Learn all about WordAds":["L\u00e4r dig allt om WordAds"],"Earn income by adding high quality ads to your post":["Tj\u00e4na pengar genom att l\u00e4gga till annonser av h\u00f6g kvalitet till ditt inl\u00e4gg"],"Hide ad on mobile views":["D\u00f6lj annons i mobila vyer"],"business is closed on a full day\u0004Closed":["St\u00e4ngd"],"block search term\u0004schedule":["tidsinst\u00e4ll"],"block search term\u0004closing time":["st\u00e4ngningstid"],"block search term\u0004opening hours":["\u00f6ppettider"],"Add an interactive slideshow.":["L\u00e4gg till ett interaktivt bildspel."],"Visit count threshold":["Bes\u00f6ksantalsgr\u00e4ns"],"Repeat Visitor":["\u00c5terkommande bes\u00f6kare"],"This block will only appear to people who have visited this page more than once.":["Detta block visas bara f\u00f6r personer som har bes\u00f6kt sidan minst en g\u00e5ng tidigare.","Detta block visas bara f\u00f6r personer som har bes\u00f6kt sidan minst %d g\u00e5nger tidigare."],"Show after threshold":["Visa efter gr\u00e4ns"],"Show before threshold":["Visa f\u00f6re gr\u00e4ns"],"This block will only appear to people who are visiting this page for the first time.":["Detta block visas bara f\u00f6r personer som bes\u00f6ker denna sida f\u00f6r f\u00f6rsta g\u00e5ngen.","Detta block kommer bara att visas f\u00f6r personer som har bes\u00f6kt denna sida h\u00f6gst %d g\u00e5nger."],"Effects":["Effekter"],"Edit Slideshow":["Redigera bildspel"],"Drag images, upload new ones or select files from your library.":["Dra bilder, ladda upp nya eller v\u00e4lj filer fr\u00e5n ditt bibliotek."],"Pick an ad format":["V\u00e4lj ett annonsformat"],"Rectangle 300x250":["Rektangel 300x250"],"Wide Skyscraper 160x600":["Bred Skyscraper 160x600"],"Mobile Leaderboard 320x50":["Mobil Leaderboard 320x50"],"Leaderboard 728x90":["Rankningslista 728x90"],"Edit video":["Redigera video"],"Uploading\u2026":["Laddar upp ..."],"Transition effect":["\u00d6verg\u00e5ngseffekt"],"The Reduce Motion accessibility option is selected, therefore autoplay will be disabled in this browser.":["Alternativet Minska r\u00f6relse\u00e5tkomst \u00e4r valt, s\u00e5 automatisk uppspelning kommer att inaktiveras i den h\u00e4r webbl\u00e4saren."],"Friday":["Fredag"],"Sunday":["S\u00f6ndag"],"Thursday":["Torsdag"],"Wednesday":["Onsdag"],"Tuesday":["Tisdag"],"Monday":["M\u00e5ndag"],"Saturday":["L\u00f6rdag"],"Add Hours":["L\u00e4gg till timmar"],"Display opening hours for your business.":["Visa \u00f6ppettider f\u00f6r ditt f\u00f6retag."],"Business Hours":["\u00d6ppettider"],"Loading business hours":["L\u00e4ser in \u00f6ppettider"],"Closing":["St\u00e4nger"],"Opening":["\u00d6ppnar"],"Open":["\u00d6ppen"],"Subscriber count unavailable":["Prenumerantantal \u00e4r inte tillg\u00e4ngligt"],"Show total subscribers":["Visa totalt antal prenumeranter"],"Search for and insert an animated image.":["S\u00f6k efter och infoga en animerad bild."],"ads":["annonser"],"Ad":["Annons"],"GIF":["GIF"],"Write caption\u2026":["Skriv bildtext\u2026"],"Search for a term or paste a Giphy URL":["S\u00f6k efter en term eller klistra in en Giphy-URL"],"block search term\u0004gallery":["galleri"],"block search term\u0004slider":["slider"],"block search term\u0004join":["g\u00e5 med"],"A form enabling readers to get notifications when new posts are published from this site.":["Ett formul\u00e4r som l\u00e5ter l\u00e4sare f\u00e5 meddelanden n\u00e4r nya webbplatsen publicerar nya inl\u00e4gg."],"Subscription Form":["Prenumerationsformul\u00e4r"],"Are you sure you wish to leave this page?":["\u00c4r du s\u00e4ker p\u00e5 att du vill l\u00e4mna denna sida?"],"Use regular characters and punctuation to style text, links, and lists.":["Anv\u00e4nd vanliga tecken och skiljetecken f\u00f6r att skriva text, l\u00e4nkar och listor."],"Write your _Markdown_ **here**\u2026":["Skriv din _Markdown_ **h\u00e4r**\u2026"],"block search term\u0004sell":["s\u00e4lj"],"block search term\u0004shop":["butik"],"Delay between transitions (in seconds)":["F\u00f6rdr\u00f6jning mellan \u00f6verg\u00e5ngar (i sekunder)"],"The Swiper library could not be loaded.":["Swiper-biblioteket kunde inte h\u00e4mtas."],"Lets you create and embed credit and debit card payment buttons with minimal setup.":["L\u00e5ter dig skapa och b\u00e4dda in knappar f\u00f6r betalning med kredit- och betalkort med minimal konfiguration."],"Create one on PayPal":["Skapa en p\u00e5 PayPal"],"Enter the email address associated with your PayPal account. Don\u2019t have an account?":["Ange e-postadressen som \u00e4r kopplad till ditt PayPal-konto. Har du inget konto?"],"Slideshow transition effect\u0004Fade":["Tona"],"Slideshow transition effect\u0004Slide":["Bild"],"Autoplay":["Spela upp automatiskt"],"Autoplay between slides":["Automatisk uppspelning mellan bilder"],"Simple Payments button":["Enkel betalningsknapp"],"Support reference":["Supportreferens"],"Describe your item in a few words":["Beskriv ditt objekt med n\u00e5gra ord"],"Invalid price.":["Ogiltigt pris."],"Currency":["Valuta"],"Allow people to buy more than one item at a time":["L\u00e5t folk k\u00f6pa mer \u00e4n en sak \u00e5t g\u00e5ngen."],"Item name":["Objektnamn"],"Please add a brief title so that people know what they\u2019re paying for.":["L\u00e4gg till en kort rubrik s\u00e5 att folk vet vad de betalar f\u00f6r."],"If you\u2019re selling something, you need a price tag. Add yours here.":["Om du s\u00e4ljer n\u00e5got beh\u00f6ver du en prislapp. L\u00e4gg till din h\u00e4r."],"We know every penny counts, but prices in this currency can\u2019t contain decimal values.":["Vi vet att varje \u00f6re r\u00e4knas, men priserna i den h\u00e4r valutan kan inte inneh\u00e5lla decimaler."],"The price cannot have more than %d decimal place.":["Priset kan inte ha mer \u00e4n %d decimal.","Priset kan inte ha mer \u00e4n %d decimaler."],"Your price is negative \u2014 enter a positive number so people can pay the right amount.":["Ditt pris \u00e4r negativt \u2014 ange ett positivt v\u00e4rde s\u00e5 att folk kan betala r\u00e4tt summa."],"Add a marker\u2026":["L\u00e4gg till en mark\u00f6r\u2026"],"Edit Image":["Redigera bild"],"Product Image":["Produktbild"],"Choose":["V\u00e4lj"],"Confirm":["Bekr\u00e4fta"],"Choose Multiple":["V\u00e4lj flera"],"Accept":["Acceptera"],"Compact, but powerful. Add a select box with several items.":["Kompakt, men kraftfullt. L\u00e4gg till en valruta med flera objekt."],"Dropdown":["Rullgardinsmeny"],"Select":["V\u00e4lj"],"People love options. Add several checkbox items.":["Folk \u00e4lskar alternativ. L\u00e4gg till flera kryssruteobjekt."],"Checkbox Group":["Kryssrutegrupp"],"Add a single checkbox.":["L\u00e4gg till en enstaka kryssruta."],"Let folks speak their mind. This text box is great for longer responses.":["L\u00e5t folk s\u00e4ga vad de tycker. Den h\u00e4r textrutan \u00e4r bra f\u00f6r l\u00e4ngre svar."],"Inspired by radios, only one radio item can be selected at a time. Add several radio button items.":["Med inspiration fr\u00e5n radion, man kan bara v\u00e4lja ett radioobjekt \u00e5t g\u00e5ngen. L\u00e4gg till flera radioknappsobjekt."],"No results.":["Inga resultat."],"Colors":["F\u00e4rger"],"Show street names":["Visa gatunamn"],"Map Theme":["Karttema"],"Add a location":["L\u00e4gg till en plats"],"Add marker":["L\u00e4gg till mark\u00f6r"],"Markers":["Mark\u00f6rer"],"%d result found, use up and down arrow keys to navigate.":["%d resultat hittades, anv\u00e4nd upp och nedpilarna f\u00f6r att navigera.","%d resultat hittades, anv\u00e4nd upp och nedpilarna f\u00f6r att navigera."],"Create an account or log in to Mapbox.":["Skapa ett konto eller logga in p\u00e5 Mapbox."],"Set Token":["Ange token"],"Paste Token Here":["Klistra in token h\u00e4r"],"Locate and copy the default access token. Then, paste it into the field below.":["Identifiera och kopiera \u00e5tkomsttoken. Klistra sedan in den i nedanst\u00e5ende f\u00e4lt."],"To use the map block, you need an Access Token.":["Du beh\u00f6ver en \u00e5tkomsttoken f\u00f6r att anv\u00e4nda kartblock."],"Remove Token":["Ta bort token"],"Update Token":["Uppdatera token"],"Mapbox Access Token":["\u00c5tkomsttoken f\u00f6r Mapbox"],"Pay with PayPal":["Betala med PayPal"],"block search term\u0004contact":["kontakt"],"block search term\u0004feedback":["feedback"],"Telephone":["Telefon"],"Mobile":["Mobil"],"Cellular phone":["Mobiltelefon"],"Calendar":["Kalender"],"Date Picker":["Datumv\u00e4ljare"],"The best way to set a date. Add a date picker.":["Det b\u00e4sta s\u00e4ttet att st\u00e4lla in ett datum. L\u00e4gg till en datumv\u00e4ljare."],"day month year":["dag m\u00e5nad \u00e5r"],"Multiline text":["Text med flera rader"],"Add a phone number input.":["L\u00e4gg till en inmatning f\u00f6r telefonnummer."],"Add an address input for a website.":["L\u00e4gg till en adressinmatning f\u00f6r en webbplats."],"internet page":["internetsida"],"Want to reply to folks? Add an email address input.":["Vill du kunna svara p\u00e5 folks kommentarer? L\u00e4gg till en e-postadressinmatning."],"mail":["E-post"],"A simple way to get feedback from folks visiting your site.":["Ett enkelt s\u00e4tt att f\u00e5 \u00e5terkoppling fr\u00e5n folk som bes\u00f6ker din webbplats."],"Introductions are important. Add an input for folks to add their name.":["Introduktioner \u00e4r viktiga. L\u00e4gg till en inmatning d\u00e4r folk kan l\u00e4gga till sitt namn."],"When you need just a small amount of text, add a text input.":["N\u00e4r du bara beh\u00f6ver en liten textm\u00e4ngd, l\u00e4gg till en textimatning."],"%s is not a valid email address.":["%s \u00e4r inte en giltig e-postadress."],"Default Checked State":["Markerat standardtillst\u00e5nd"],"ID":["ID"],"Default Value":["Standardv\u00e4rde"],"Add option":["L\u00e4gg till alternativ"],"Insert option":["Infoga alternativ"],"Remove option":["Ta bort alternativ"],"Write label\u2026":["Skriv etikett\u2026"],"Field Settings":["F\u00e4ltinst\u00e4llningar"],"Write option\u2026":["Skriv alternativ\u2026"],"You can enter multiple email addresses separated by commas.":["Du kan ange flera e-postadresser separerade med kommatecken."],"Required":["Obligatorisk"],"Set the placeholder text":["St\u00e4ll in platsh\u00e5llartext"],"You\u2019ll receive an email notification each time someone fills out the form. Where should it go, and what should the subject line be?":["Du kommer att f\u00e5 en e-postavisering varje g\u00e5ng n\u00e5gon fyller i formul\u00e4ret. Vart ska den skickas, och vad ska \u00e4mnesraden vara?"],"Add form":["L\u00e4gg till formul\u00e4r"],"(If you leave these blank, notifications will go to the author with the post or page title as the subject line.)":["(Om du l\u00e4mnar dessa f\u00e4lt tomma kommer aviseringar att skickas till f\u00f6rfattaren med inl\u00e4ggets eller sidans titel som \u00e4mnesrad.)"],"Email address":["E-postadress"],"name@example.com":["namn@exempel.com"],"Form":["Formul\u00e4r"],"Let's work together":["L\u00e5t oss arbeta tillsammans"],"%s and %s are not a valid email address.":["%s och %s \u00e4r inte en giltig e-postadress."],"Email subject line":["\u00c4mnesrad f\u00f6r e-post"],"%s are not a valid email address.":["%s \u00e4r inte en giltig e-postadress."],"Email Feedback Settings":["Inst\u00e4llningar f\u00f6r feedback via e-post"],"block search term\u0004photos":["foton"],"block search term\u0004address":["adress"],"block search term\u0004phone":["telefon"],"block search term\u0004message":["meddelande"],"block search term\u0004map":["karta"],"Likes and Sharing":["Gilla & Dela"],"block search term\u0004navigation":["navigering"],"image style\u0004Original":["Original"],"Pick an image filter":["V\u00e4lj ett bildfilter"],"image style\u0004Black and White":["Svart och vit"],"image style\u0004Sepia":["Sepia"],"image style\u0004Gingham":["Gingham"],"image style\u0004Clarendon":["Clarendon"],"Open address in Google Maps":["\u00d6ppna adress i Google Maps"],"Write a message for your audience here. If you leave this blank, we'll use the post title as the message.":["Skriv ett meddelande h\u00e4r f\u00f6r din publik. Om du l\u00e4mnar detta tomt anv\u00e4nder vi posttiteln som meddelandet."],"Columns":["Kolumner"],"Edit Gallery":["Redigera galleri"],"Remove Image":["Ta bort bild"],"Upload an image":["Ladda upp en bild"],"Link To":["L\u00e4nk till"],"Tiled Gallery settings":["Inst\u00e4llningar f\u00f6r mosaikgalleri"],"block search term\u0004place":["plats"],"block search term\u0004mobile":["mobil"],"block search term\u0004telephone":["telefon"],"Text Color":["Textf\u00e4rg"],"Connect an account":["Anslut ett konto"],"Add text\u2026":["L\u00e4gg till text\u2026"],"Terrain":["Terr\u00e4ng"],"Satellite":["Satellit"],"Black and white":["Svart och vit"],"Basic":["Grundl\u00e4ggande"],"Phone Number":["Telefonnummer"],"Phone number":["Telefonnummer"],"Delete Marker":["Ta bort mark\u00f6r"],"Add an interactive map showing one or more locations.":["L\u00e4gg till en interaktiv karta som visar en eller flera platser."],"block search term\u0004location":["plats"],"block search term\u0004direction":["riktning"],"Tiled gallery layout\u0004Circles":["Cirklar"],"Tiled Gallery":["Mosaikgalleri"],"Connect and select the accounts where you'd like to share your post.":["Anslut och v\u00e4lj de konton d\u00e4r du vill dela ditt inl\u00e4gg."],"Marker Caption":["Tidsmark\u00f6rstext"],"Marker Title":["Tidsmark\u00f6rstitel"],"block search term\u0004cell":["cell"],"Lets you add a phone number with an automatically generated click-to-call link.":["L\u00e5ter dig l\u00e4gga till ett telefonnummer med en automatiskt genererad samtalsl\u00e4nk."],"block search term\u0004images":["bilder"],"block search term\u0004email":["e-post"],"Tiled gallery layout\u0004Tiled columns":["kolumner sida vid sida"],"Tiled gallery layout\u0004Square tiles":["rutor sida vid sida"],"Tiled gallery layout\u0004Tiled mosaic":["mosaik sida vid sida"],"block search term\u0004pictures":["bilder"],"Display multiple images in an elegantly organized tiled layout.":["Visa flera bilder i en elegant organiserad layout."],"Button Color Settings":["Knappens f\u00e4rginst\u00e4llningar"],"Address":["Adress"],"Country":["Land"],"City":["Ort"],"Address Line 3":["Adressrad 3"],"Address Line 2":["Adressrad 2"],"Street Address":["Gatuadress"],"Link address to Google Maps":["L\u00e4nkadress till Google Maps"],"Lets you add an email address, phone number, and physical address with improved markup for better SEO results.":["L\u00e5ter dig l\u00e4gga till en e-postadress, telefonnummer och fysisk adress med f\u00f6rb\u00e4ttrad kod f\u00f6r b\u00e4ttre s\u00f6kmotorsoptimeringsresultat."],"Postal\/Zip Code":["Postnummer"],"State\/Province\/Region":["Stat\/Landskap\/Region"],"Lets you add a physical address with Schema markup.":["L\u00e5ter dig l\u00e4gga till en fysisk adress med Schema-kod."],"image %1$d of %2$d in gallery":["bild %1$d av %2$d i galleriet"],"Customize your message":["Anpassa ditt meddelande"],"Share this post":["Dela detta inl\u00e4gg"],"%d character remaining":["%d tecken \u00e5terst\u00e5r","%d tecken \u00e5terst\u00e5r"],"Lets you add an email address with an automatically generated click-to-email link.":["L\u00e5ter dig l\u00e4gga till en e-postadress med en automatiskt genererad e-postl\u00e4nk."],"Whoops! There was an error and we couldn't process your subscription. Please reload the page and try again.":["Oj d\u00e5! Det uppstod ett fel och vi kunde inte behandla din prenumeration. V\u00e4nligen ladda om sidan och f\u00f6rs\u00f6k igen."],"Success! You're on the list.":["Klart! Du \u00e4r med p\u00e5 listan."],"Processing\u2026":["Bearbetar\u2026"],"Closed":["St\u00e4ngd"],"Map":["Karta"],"By clicking submit, you agree to share your email address with the site owner and Mailchimp to receive marketing, updates, and other emails from the site owner. Use the unsubscribe link in those emails to opt out at any time.":["Genom att klicka p\u00e5 skicka in s\u00e5 g\u00e5r du med p\u00e5 att dela din e-postadress med webbplatsens \u00e4gare och Mailchimp f\u00f6r att ta emot marknadsf\u00f6ring, uppdateringar och andra e-postmeddelanden fr\u00e5n webbplatsens \u00e4gare. Du kan n\u00e4r som helst anv\u00e4nda l\u00e4nken i e-postmeddelandena f\u00f6r att s\u00e4ga upp prenumerationen."],"Enter your email":["Ange din e-postadress"],"Join my email list":["G\u00e5 med i min e-postlista"],"Phone":["Telefon"],"Go to Sharing settings":["G\u00e5 till delningsinst\u00e4llningarna"],"Your LinkedIn connection needs to be reauthenticated to continue working \u2013 head to Sharing to take care of it.":["Din LinkedIn-anslutning m\u00e5ste \u00e5terautentiseras f\u00f6r att forts\u00e4tta fungera. G\u00e5 till Delning f\u00f6r att hantera det."],"Invalid price":["Ogiltigt pris"],"We want to make sure payments reach you, so please add an email address.":["Vi vill se till att betalningar n\u00e5r dig, s\u00e5 l\u00e4gg till en e-postadress."],"Product":["Produkt"],"Display date":["Publiceringsdatum"],"Copied!":["Kopierad!"],"verb\u0004Copy":["Kopiera"],"Background Color":["Bakgrundsf\u00e4rg"],"Upgrade":["Uppgradera"],"images":["bilder"],"Attachment Page":["Sida f\u00f6r bilaga"],"Contact Info":["Kontaktuppgifter"],"Media File":["Mediafil"],"Visibility":["Synlighet"],"Join %s other subscriber":["G\u00f6r som %s annan, prenumerera du med.","G\u00f6r som %s andra, prenumerera du med."],"Submit":["Skicka"],"Subscribe":["Prenumerera"],"Slideshow":["Bildspel"],"Before you hit Publish, please refresh the following connection(s) to make sure we can Publicize your post:":["Uppdatera f\u00f6ljande anslutning(ar) innan du klickar p\u00e5 Publicera, f\u00f6r att garantera att vi kan publicera ditt inl\u00e4gg."],"Connect":["Logga in"],"Email Address":["E-postadress"],"Related Posts":["Relaterade inl\u00e4gg"],"Notifications":["Notiser"],"Markdown":["Markdown"],"Show likes.":["Visa gillningar"],"Show sharing buttons.":["Visa delningsknappar."],"Cancel":["Avbryt"],"None":["Inget"],"Preview":["F\u00f6rhandsgranska"],"Price":["Pris"],"(required)":["(m\u00e5ste anges)"],"Checkbox":["Kryssruta"],"Email":["E-post"],"Message":["Meddelande"],"Radio":["Radio"],"Text":["Text"],"Textarea":["Textomr\u00e5de"],"Website":["Webbplats"],"Name":["Namn"],"Option":["Alternativ"],"Search":["S\u00f6k"],"e-mail":["e-post"]}},"comment":{"reference":"_inc\/blocks\/editor.js"}}
\ No newline at end of file
diff --git a/wp-content/languages/plugins/jetpack-sv_SE.mo b/wp-content/languages/plugins/jetpack-sv_SE.mo
new file mode 100644
index 000000000..3b1c4a52b
Binary files /dev/null and b/wp-content/languages/plugins/jetpack-sv_SE.mo differ
diff --git a/wp-content/languages/plugins/jetpack-sv_SE.po b/wp-content/languages/plugins/jetpack-sv_SE.po
new file mode 100644
index 000000000..e675960bd
--- /dev/null
+++ b/wp-content/languages/plugins/jetpack-sv_SE.po
@@ -0,0 +1,15001 @@
+# Translation of Plugins - Jetpack by WordPress.com - Stable (latest release) in Swedish
+# This file is distributed under the same license as the Plugins - Jetpack by WordPress.com - Stable (latest release) package.
+msgid ""
+msgstr ""
+"PO-Revision-Date: 2019-11-06 00:54:14+0000\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: GlotPress/2.4.0-alpha\n"
+"Language: sv_SE\n"
+"Project-Id-Version: Plugins - Jetpack by WordPress.com - Stable (latest release)\n"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "View my plan"
+msgstr "Visa mitt paket"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Congratulations! Your site is now on a paid plan."
+msgstr "Grattis! Din webbplats har nu ett betalt paket."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Congratulations! Your site is now on the %s plan."
+msgstr "Grattis! Din webbplats har nu %s-paketet."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "This block will only appear to a visitor who visited the page three or more times."
+msgstr "Det här blocket visas bara för besökare som har besökt sidan tre eller flera gånger."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Or a new one."
+msgstr "Eller en ny."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "To use this block, select a previously created payment plan."
+msgstr "Om du vill använda detta block väljer du ett tidigare skapat betalningspaket. "
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "To use this block, first add at least one payment plan."
+msgstr "För att använda det här blocket måste du lägga till minst ett betalt paket."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Add a plan"
+msgstr "Lägg till ett paket"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Add this plan"
+msgstr "Lägg till detta paket"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "This block will be hidden from your visitors until you connect to Stripe."
+msgstr "Detta block kommer att döljas från dina besökare tills du ansluter till Stripe."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Connect to Stripe to use this block on your site"
+msgstr "Anslut till Stripe för att använda det här blocket på din webbplats"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Markdown is a text formatting syntax that is converted into HTML. You can _emphasize_ text or **make it strong** with just a few characters."
+msgstr "Markdown är en textformateringssyntax som konverteras till HTML. Du kan _betona_ text eller **göra den stark** med bara några få tecken."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Try Markdown"
+msgstr "Prova markdown"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Image Size"
+msgstr "Bildstorlek"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Image Settings"
+msgstr "Bildinställningar"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Map Preview"
+msgstr "Förhandsgranskning av karta"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Confirmation Message"
+msgstr "Bekräftelsemeddelande"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Redirect Address"
+msgstr "Omdirigera adress"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Message Text"
+msgstr "Meddelandetext"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Redirect to another webpage"
+msgstr "Omdirigera till en annan webbsida"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Show a custom text message"
+msgstr "Visa ett anpassat textmeddelande"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Show a summary of submitted fields"
+msgstr "Visa en sammanfattning av skickade fält"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "On Submission"
+msgstr "Vid insändning"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Take flight in ultimate comfort with ths stylish t-shirt featuring the Jetpack logo."
+msgstr "Pröva vingarna i ultimat komfort med den här läckra t-shirten med Jetpack-logotypen."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Jetpack t-shirt"
+msgstr "Jetpack t-shirt"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Serves images using Jetpack's fast global network of servers."
+msgstr "Servar bilder med hjälp av Jetpacks snabba globala nätverk av servrar."
+
+#: modules/widgets/facebook-likebox.php:196
+msgid "Show Timeline"
+msgstr "Visa tidslinje"
+
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:366
+msgid "Jetpack.com detected an error on the WPcom Self Test."
+msgstr "Jetpack.com detected an error on the WPcom Self Test."
+
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:364
+msgid "The test timed out which may sometimes indicate a failure or may be a false failure."
+msgstr "Tidsgränsen för testet uppnåddes, vilket ibland indikerar ett fel eller kan vara ett falskt fel."
+
+#. translators: Placeholder is a link to site's Jetpack debug page.
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:346
+msgid "Visit the Jetpack.com debug page for more information or contact support."
+msgstr "Besök felsökningssidan för Jetpack.com för mer information eller kontakta supporten."
+
+#: _inc/lib/admin-pages/class.jetpack-admin-page.php:438
+msgid "Access the full list of Jetpack modules available on your site"
+msgstr "Få den fullständiga förteckningen över Jetpack-moduler som finns tillgängliga på din webbplats"
+
+#: _inc/lib/admin-pages/class.jetpack-admin-page.php:428
+msgid "Manage your network's Jetpack settings"
+msgstr "Hantera ditt nätverks Jetpack-inställningar"
+
+#: _inc/lib/admin-pages/class.jetpack-admin-page.php:418
+msgid "Manage your network's Jetpack Sites"
+msgstr "Hantera ditt nätverks Jetpack-webbplatser"
+
+#: modules/contact-form/grunion-contact-form.php:1845
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Thank you for your submission!"
+msgstr "Tack för ditt bidrag!"
+
+#: modules/seo-tools/jetpack-seo-posts.php:70
+msgid "Custom post description to be used in HTML tag."
+msgstr "Anpassad inläggsbeskrivning som ska användas i HTML-tagg."
+
+#: class.jetpack-cli.php:186
+msgid "The site is not currently connected, so nothing to do!"
+msgstr "Webbplatsen är för närvarande inte ansluten, så det finns inget att göra!"
+
+#: extensions/blocks/slideshow/slideshow.php:184
+msgid "Play Slideshow"
+msgstr "Spela bildspel"
+
+#: extensions/blocks/slideshow/slideshow.php:178
+msgid "Pause Slideshow"
+msgstr "Pausa bildspel"
+
+#. translators: %d: Slide number.
+#: extensions/blocks/slideshow/slideshow.php:140
+msgid "Go to slide %d"
+msgstr "Gå till bild %d"
+
+#: extensions/blocks/slideshow/slideshow.php:83
+msgid "Next Slide"
+msgstr "Nästa bild"
+
+#: extensions/blocks/slideshow/slideshow.php:84
+msgid "Previous Slide"
+msgstr "Nästa bild"
+
+#: _inc/lib/core-api/class.jetpack-core-api-site-endpoints.php:97
+msgid "Visitors tracked by Jetpack"
+msgstr "Besökare spåras av Jetpack"
+
+#: json-endpoints/jetpack/class-jetpack-json-api-install-backup-helper-script-endpoint.php:55
+msgid "Helper script body must be base64 encoded"
+msgstr "Brödtexten för Helper-skriptet måste vara base64-kodat"
+
+#: json-endpoints/jetpack/class-jetpack-json-api-install-backup-helper-script-endpoint.php:50
+msgid "You must specify a helper script body"
+msgstr "Du måste ange brödtext för helper-skriptet"
+
+#: json-endpoints/jetpack/class-jetpack-json-api-delete-backup-helper-script-endpoint.php:50
+msgid "You must specify a helper script path"
+msgstr "Du måste ange sökväg till helper-skriptet"
+
+#: _inc/jetpack-strings.php:632
+msgid "Have a question? We’d love to help! {{a}}Send a question to the Jetpack support team.{{/a}}"
+msgstr "Har du några frågor? Vi hjälper gärna till! {{a}}Skicka en fråga till Jetpack-supportteamet.{{/a}}"
+
+#: _inc/jetpack-strings.php:631
+msgid "Jetpack has many powerful tools that can help you achieve your goals"
+msgstr "Jetpack har flera kraftfulla verktyg som kan hjälpa dig att uppnå dina mål"
+
+#: _inc/jetpack-strings.php:630
+msgid " We’ve highlighted some of the features you rely on below."
+msgstr " Vi går igenom några att de funktionerna du förlitar dig på nedan."
+
+#: _inc/jetpack-strings.php:629
+msgid "Jetpack is currently powering features on your site. Once you disable Jetpack, these features will no longer be available and your site may no longer function the same way."
+msgstr "Jetpack driver för tillfället funktioner på din webbplats. När du inaktiverar Jetpack, kommer de här funktionerna inte längre att vara tillgängliga och din webbplats kanske inte längre fungerar på samma sätt."
+
+#: _inc/jetpack-strings.php:628
+msgid "Jetpack is currently powering features on your site. Once you disconnect Jetpack, these features will no longer be available and your site may no longer function the same way."
+msgstr "Jetpack driver för tillfället funktioner på din webbplats. När du kopplar från Jetpack, kommer de här funktionerna inte längre att vara tillgängliga och din webbplats kanske inte längre fungerar på samma sätt."
+
+#: _inc/jetpack-strings.php:627
+msgid "Grow your traffic with automated social {{a}}publishing and sharing{{/a}}"
+msgstr "Öka din trafik med automatiserad {{a}}publicering och delning{{/a}} på sociala medier"
+
+#: _inc/jetpack-strings.php:626
+msgid "Block {{a}}brute force attacks{{/a}} and get immediate notifications if your site is down"
+msgstr "Blockera {{a}}råstyrkeattacker{{/a}} och bli meddelad omedelbart om din webbplats ligger nere"
+
+#: _inc/jetpack-strings.php:624
+msgid "Disable"
+msgstr "Inaktivera"
+
+#: _inc/jetpack-strings.php:620
+msgid "Are you sure you want to disconnect?"
+msgstr "Är du säker på att du vill koppla från?"
+
+#: _inc/jetpack-strings.php:619
+msgid "Disable Jetpack"
+msgstr "Inaktivera Jetpack"
+
+#: _inc/jetpack-strings.php:571
+msgctxt "Notice in the empty statistics chart"
+msgid "No activity this period"
+msgstr "Ingen aktivitet denna period"
+
+#: _inc/jetpack-strings.php:199
+msgid "We back up your website with every change you make, making it easy to fix your mistakes."
+msgstr "Vi säkerhetskopierar din webbplats vid varje ändring du gör, vilket gör det enkelt att rätta till dina misstag."
+
+#: _inc/jetpack-strings.php:198
+msgid "Automated Real-time Backups"
+msgstr "Automatiserade säkerhetskopieringar i realtid"
+
+#: _inc/jetpack-strings.php:197
+msgid "We back up your website every day, so you never have to worry about your data again."
+msgstr "Vi säkerhetskopierar din webbplats varje dag, så du behöver aldrig oroa dig för dina data igen."
+
+#: _inc/jetpack-strings.php:196
+msgid "Automated Daily Backups"
+msgstr "Automatiserade dagliga säkerhetskopieringar"
+
+#: _inc/jetpack-strings.php:183
+msgid "View Your Backups"
+msgstr "Visa dina säkerhetskopior"
+
+#: _inc/jetpack-strings.php:182
+msgid "A Jetpack Site securely backed up with Jetpack Backup"
+msgstr "En Jetpack-webbplats säkerhetskopierad med Jetpack Backup"
+
+#: _inc/jetpack-strings.php:35
+msgid "Jetpack Real-time Backup Plan"
+msgstr "Jetpack-paket med säkerhetskopieringar i realtid"
+
+#: _inc/jetpack-strings.php:33
+msgid "Your plan: Jetpack Free + Real-time Backup"
+msgstr "Ditt paket: Jetpack Free + säkerhetskopieringar i realtid"
+
+#: _inc/jetpack-strings.php:32
+msgid "Jetpack Daily Backup Plan"
+msgstr "Jetpack-paket med dagliga säkerhetskopieringar"
+
+#: _inc/jetpack-strings.php:31 _inc/jetpack-strings.php:34
+msgid "Worried about security? Get automated security fixes and more: {{a}}Upgrade now{{/a}}"
+msgstr "Oroad för säkerheten? Få automatiska säkerhetsuppdateringar med mera: {{a}}Uppgradera nu{{/a}}"
+
+#: _inc/jetpack-strings.php:30
+msgid "Your plan: Jetpack Free + Daily Backup"
+msgstr "Ditt paket: Jetpack Free + dagliga säkerhetskopieringar"
+
+#. Translators: first variable is the URL of the web site without the protocol,
+#. e.g. mysite.com
+#: 3rd-party/vaultpress.php:26
+msgid "You can access your backups on your site's Activity page."
+msgstr "Du kommer åt dina säkerhetskopior på din webbplats Aktivitet-sida."
+
+#: _inc/jetpack-strings.php:625
+msgid "Speed up your site and provide mobile-ready images with {{a}}our CDN{{/a}}"
+msgstr "Snabba upp din webbplats och erbjud bilder som är mobilredo med {{a}}vår CDN{{/a}}"
+
+#: _inc/jetpack-strings.php:621
+msgid "Are you sure you want to disconnect and deactivate?"
+msgstr "Är du säker på att du koppla från och inaktivera?"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "You cancelled connecting your site to Stripe."
+msgstr "Du avbröt anslutningen av din webbplats till Stripe."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Congrats! Your site is now connected to Stripe. You can start making money by adding your first subscription!"
+msgstr "Grattis! Din webbplats är nu ansluten till Stripe. Du kan börja tjäna pengar genom att lägga till din första prenumeration!"
+
+#: _inc/jetpack-strings.php:123
+msgid "{{a}}Activate{{/a}} to optimize image sizes and load images from Jetpack's fast global network of servers. This improves your site's performance on desktop and mobile devices."
+msgstr "{{a}}Aktivera{{/a}} för att optimera bildstorlekar och läsa in bilder från Jetpacks snabba globala nätverk av servrar. Det förbättrar din webbplats prestanda på stationära och mobila enheter."
+
+#: _inc/jetpack-strings.php:483
+msgid "Use Markdown syntax to compose content with links, lists, and other styles. This setting enables Markdown in the Classic Editor as well as within a Classic Editor block."
+msgstr "Använd Markdown-syntax för att komponera innehåll med länkar, listor och andra stilar. Den här inställningen aktiverar Markdown i den klassiska redigeraren samt inuti ett block i den klassiska redigeraren."
+
+#: modules/shortcodes/archiveorg.php:95
+msgid "Archive.org"
+msgstr "Archive.org"
+
+#: modules/shortcodes/archiveorg-book.php:81
+msgid "Archive.org Book"
+msgstr "Archive.org Book"
+
+#: _inc/jetpack-strings.php:121
+msgid "Jetpack is optimizing your image sizes and download speed using our fast global network of servers. This improves your site's performance on desktop and mobile devices."
+msgstr "Jetpack optimerar bildstorlekar och hämtningshastighet med vårt snabba globala nätverk av servrar. Det förbättrar din webbplats prestanda på stationära och mobila enheter."
+
+#: _inc/jetpack-strings.php:119
+msgid "Image Accelerator"
+msgstr "Bildaccelerator"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Generating preview…"
+msgstr "Genererar förhandsgranskning…"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Remove Poster Image"
+msgstr "Ta bort posterbild"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "There is no poster image currently selected"
+msgstr "Det finns ingen vald posterbild för tillfället."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "The current poster image url is %s"
+msgstr "Den aktuella webbadressen för posterbild är %s"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Replace image"
+msgstr "Ersätt bild"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Select Poster Image"
+msgstr "Välj bildposter"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Poster Image"
+msgstr "Posterbild"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "VideoPress preload setting"
+msgid "None"
+msgstr "Ingen"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "VideoPress preload setting"
+msgid "Metadata"
+msgstr "Meta-data"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "VideoPress preload setting"
+msgid "Auto"
+msgstr "Auto"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Preload"
+msgstr "Förhandsladda"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Playback Controls"
+msgstr "Uppspelningsreglage"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Muted"
+msgstr "Tystad"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Loop"
+msgstr "Loop"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Video Settings"
+msgstr "Videoinställningar"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Note: Autoplaying videos may cause usability issues for some visitors."
+msgstr "Obs! Automatisk uppspelning av videoklipp kan försvåra användningen för vissa besökare."
+
+#: _inc/jetpack-strings.php:312
+msgid "Start with free"
+msgstr "Starta med Free"
+
+#: _inc/jetpack-strings.php:311
+msgid "Now that you're set up, pick a plan that fits your needs."
+msgstr "När du nu har ställt in kan du välja ett paket som passar dina behov."
+
+#: _inc/lib/components.php:65
+msgid "a paid plan"
+msgstr "ett betalpaket"
+
+#: _inc/lib/class.core-rest-api-endpoints.php:3150
+msgid "Activated Akismet"
+msgstr "Aktiverad Akismet"
+
+#: _inc/lib/class.core-rest-api-endpoints.php:3145
+msgid "Unable to activate Akismet"
+msgstr "Det gick inte att aktivera Akismet"
+
+#: _inc/lib/core-api/class.jetpack-core-api-site-endpoints.php:220
+msgid "Site benefits correctly received."
+msgstr "Webbplatsförmånerna togs emot korrekt."
+
+#: _inc/lib/core-api/class.jetpack-core-api-site-endpoints.php:211
+msgid "The number of times visitors have shared your posts with the world using Jetpack"
+msgstr "Antalet gånger som besökare har delat dina inlägg med omvärlden via Jetpack"
+
+#: _inc/lib/core-api/class.jetpack-core-api-site-endpoints.php:200
+msgid "Live social media site connections, powered by Jetpack"
+msgstr "Anslutningar i realtid på sociala medier från Jetpack"
+
+#: _inc/lib/core-api/class.jetpack-core-api-site-endpoints.php:181
+msgid "Ad-free, lightning-fast videos delivered by Jetpack"
+msgstr "Reklamfria, blixtsnabba videoklipp som levereras av Jetpack"
+
+#: _inc/lib/core-api/class.jetpack-core-api-site-endpoints.php:166
+msgid "Super-fast, mobile-ready images served by Jetpack"
+msgstr "Supersnabba, mobilklara bilder från Jetpack"
+
+#: _inc/lib/core-api/class.jetpack-core-api-site-endpoints.php:165
+msgid "Image Hosting"
+msgstr "Bildvisning"
+
+#: _inc/lib/core-api/class.jetpack-core-api-site-endpoints.php:148
+msgid "Form submissions stored by Jetpack"
+msgstr "Formulärinlämningar som lagras av Jetpack"
+
+#: _inc/lib/core-api/class.jetpack-core-api-site-endpoints.php:147
+msgid "Contact Form Feedback"
+msgstr "Återkoppling från kontaktformulär"
+
+#: _inc/lib/core-api/class.jetpack-core-api-site-endpoints.php:134
+msgid "The number of times Jetpack has backed up your site and kept it safe"
+msgstr "Antalet gånger som Jetpack har säkerhetskopierat och skyddat din webbplats"
+
+#: _inc/lib/core-api/class.jetpack-core-api-site-endpoints.php:133
+msgid "Jetpack Backup"
+msgstr "Jetpack-säkerhetskopia"
+
+#: _inc/lib/core-api/class.jetpack-core-api-site-endpoints.php:120
+msgid "People subscribed to your updates through Jetpack"
+msgstr "Personer som prenumererar på dina uppdateringar via Jetpack"
+
+#: _inc/lib/core-api/class.jetpack-core-api-site-endpoints.php:119
+msgid "Subscribers"
+msgstr "Prenumeranter"
+
+#: _inc/lib/core-api/class.jetpack-core-api-site-endpoints.php:109
+msgid "The number of malicious login attempts blocked by Jetpack"
+msgstr "Antalet skadliga inloggningsförsök som har blockerats av Jetpack"
+
+#: _inc/lib/core-api/class.jetpack-core-api-site-endpoints.php:108
+msgid "Brute force protection"
+msgstr "Skydd mot bruteforce-attacker"
+
+#: _inc/jetpack-strings.php:85
+msgid "Your Jetpack plan provides anti-spam protection through Akismet. Click 'set up' to enable it on your site."
+msgstr "Ditt Jetpack-paket inkluderar skydd mot skräpport via Akismet. Klicka på ”konfigurera” för att aktivera det på din webbplats."
+
+#: _inc/jetpack-strings.php:81
+msgid "Already have a key? {{a}}Activate Akismet{{/a}}"
+msgstr "Har du redan en nyckel? {{a}}Aktivera Akismet{{/a}}"
+
+#: _inc/lib/class.core-rest-api-endpoints.php:1159
+msgid "Unable to verify your request."
+msgstr "Det gick inte att bekräfta din begäran."
+
+#: modules/widgets/contact-info.php:456
+msgid "Please enter a valid Google API Key."
+msgstr "Ange en giltig API-nyckel från Google."
+
+#: modules/protect.php:187
+msgid "https://jetpack.com/support/multisite-protect"
+msgstr "https://jetpack.com/support/multisite-protect"
+
+#: modules/protect.php:181
+msgid "Thanks for activating Jetpack's brute force attack prevention feature! To start protecting your whole WordPress Multisite Network, please network activate the Jetpack plugin. Due to the way logins are handled on WordPress Multisite Networks, Jetpack must be network activated in order for the brute force attack prevention feature to work properly."
+msgstr "Tack för att du aktiverade Jetpacks skyddsfunktion mot bruteforce-attacker. Du måste aktivera Jetpack-tillägget för att börja skydda hela ditt WordPress Multisite-nätverk. På grund av hanteringsmetoden för inloggningar på WordPress Multisite-nätverk måste Jetpack nätverksaktiveras för att skyddet mot bruteforce-attacker ska fungera korrekt."
+
+#: modules/protect.php:179
+msgid "Jetpack Brute Force Attack Prevention cannot keep your site secure"
+msgstr "Det förebyggande skyddet mot bruteforce-attacker i Jetpack kan inte skydda din webbplats"
+
+#: _inc/blocks/editor-beta.js:12 _inc/blocks/editor.js:12
+msgid "Upgrade to a paid plan to use this block on your site."
+msgstr "Uppgradera till ett betalt paket för att använda detta block på din webbplats."
+
+#: _inc/blocks/editor-beta.js:12 _inc/blocks/editor.js:12
+msgid "Upgrade to %(planName)s to use this block on your site."
+msgstr "Uppgradera till %(planName)s för att använda det här blocket på din webbplats."
+
+#: _inc/jetpack-strings.php:706
+msgid "Verifying…"
+msgstr "Kontrollerar ..."
+
+#: _inc/jetpack-strings.php:682
+msgid "Boost your search engine ranking with the powerful SEO tools in Jetpack Premium or Professional."
+msgstr "Förbättra din sökmotorrankning med de kraftfulla verktygen för sökmotorsoptimering i Jetpack Premium eller Professional."
+
+#: _inc/jetpack-strings.php:524
+msgid "Give your site a fast-loading, streamlined look for mobile devices. Visitors will still see your regular theme on other screen sizes."
+msgstr "Ge din webbplats ett snabbt laddande och effektivt utseende för mobila enheter. Besökare ser fortfarande ditt vanliga tema på andra skärmstorlekar."
+
+#: _inc/jetpack-strings.php:515
+msgid "Create a smooth, uninterrupted reading experience by loading more content as visitors scroll to the bottom of your archive pages."
+msgstr "Skapa en snygg, oavbruten läsupplevelse genom att läsa in mer innehåll när besökare bläddrar till slutet av dina arkivsidor."
+
+#: _inc/blocks/editor-beta.js:12 _inc/blocks/editor.js:12
+msgid "You can try it out before upgrading, but only you will see it. It will be hidden from your visitors until you upgrade."
+msgstr "Du kan prova det innan du uppgraderar men bara du ser det. Det kommer att döljas från dina besökare tills du uppgraderar."
+
+#: _inc/jetpack-strings.php:456
+msgid "Customize your SEO settings"
+msgstr "Anpassa dina SEO-inställningar"
+
+#: _inc/jetpack-strings.php:457
+msgctxt "Settings header"
+msgid "WP.me Shortlinks"
+msgstr "Kortlänkar för WP.me"
+
+#: _inc/jetpack-strings.php:455
+msgid "Take control of the way search engines represent your site. With Jetpack’s SEO tools you can preview how your content will look on popular search engines and change items like your site name and tagline in seconds."
+msgstr "Ta kontroll över hur sökmotorer visar din webbplats. Med Jetpacks verktyg för sökmotoroptimering kan du förhandsgranska hur ditt innehåll kommer att se ut på populära sökmotorer och ändra saker som din webbplats namn och tagline på bara sekunder."
+
+#: modules/widgets/flickr/form.php:61
+msgid "Open images in new tab?"
+msgstr "Öppna bilder i ny flik?"
+
+#. translators: Placeholder is a link to a support document.
+#: jetpack.php:150
+msgid "Your installation of Jetpack is incomplete. If you installed Jetpack from GitHub, please refer to this document to set up your development environment: %1$s"
+msgstr "Din installation av Jetpack är ofullständig. Om du har installerat Jetpack från GitHub, hänvisa till detta dokument för att konfigurera din utvecklingsmiljö: %1$s"
+
+#: _inc/lib/class.core-rest-api-endpoints.php:2125
+msgid "Include a small chart in your admin bar with a 48-hour traffic snapshot."
+msgstr "Inkludera ett litet diagram i ditt adminfält med en ögonblicksbild över trafiken de senaste 48 timmarna."
+
+#: _inc/jetpack-strings.php:681
+msgid "Connect your site to Google Analytics in seconds with Jetpack Premium or Professional."
+msgstr "Anslut din webbplats till Google Analytics på endast några sekunder med Jetpack Premium eller Professional."
+
+#: _inc/jetpack-strings.php:639
+msgid "Log in to the WordPress mobile app"
+msgstr "Logga in på WordPress mobilapp"
+
+#: _inc/jetpack-strings.php:638
+msgctxt "A caption for a button to log in to the WordPress mobile app."
+msgid "Send link"
+msgstr "Skicka länk"
+
+#: _inc/jetpack-strings.php:637
+msgctxt "A caption for a button to cancel an action."
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: _inc/jetpack-strings.php:635
+msgid "Email me a link to log in to the app"
+msgstr "Skicka en länk till mig per e-post för att logga in på appen"
+
+#: _inc/jetpack-strings.php:506
+msgid "Send your new posts to this email address:"
+msgstr "Skicka dina nya inlägg till den här e-postadressen:"
+
+#: _inc/jetpack-strings.php:505
+msgid "Post by email is a quick way to publish new posts without visiting your site. We’ll generate a unique email address for you to send your content to, which will then appear on your site just like any other post."
+msgstr "Publicering via e-post är ett snabbt sätt att publicera nya inlägg utan att besöka din webbplats. Vi kommer att skapa en unik e-postadress som du kan skicka ditt innehåll till. Det kommer sedan att publiceras på din webbplats precis som vilket inlägg som helst."
+
+#: _inc/jetpack-strings.php:636
+msgid "Easily log in to the WordPress app by clicking the link we'll send to the email address on your account."
+msgstr "Logga enkelt in i WordPress-appen genom att klicka på länken vi skickar till e-postadressen på ditt konto."
+
+#: _inc/jetpack-strings.php:501
+msgid "The WordPress.com toolbar replaces the default WordPress admin toolbar. It offers one-click access to notifications, your WordPress.com profile and your other Jetpack and WordPress.com websites. You can also catch up on the sites you follow in the Reader."
+msgstr "WordPress.com-verktygsfältet ersätter standardverktygsfältet för administratörer på WordPress. Det ger åtkomst till aviseringar, din WordPress.com-profil och dina andra Jetpack- och WordPress.com-webbplatser. Du kan också läsa det senaste från de webbplatser som du följer i Reader."
+
+#: _inc/jetpack-strings.php:466
+msgid "Include a small chart in your admin bar with a 48-hour traffic snapshot"
+msgstr "Inkludera ett litet diagram i ditt adminfält med en ögonblicksbild över trafiken de senaste 48 timmarna."
+
+#: _inc/jetpack-strings.php:464
+msgid "Expand to update settings for how visits are counted and manage who can view this information."
+msgstr "Expandera för att uppdatera inställningarna för hur besök räknas och hantera vem som kan se den här informationen."
+
+#: _inc/jetpack-strings.php:477
+msgid "Verify site ownership with third party services"
+msgstr "Bekräfta att du äger webbplatsen gentemot tredjeparter"
+
+#: _inc/jetpack-strings.php:458
+msgid "Generate shortened URLs for simpler sharing."
+msgstr "Skapa kortare webbadresser för enklare delning."
+
+#: _inc/jetpack-strings.php:437
+msgid "Keep your visitors engaged with related content at the bottom of each post. These settings won't apply to {{a}}related posts added using the block editor{{/a}}."
+msgstr "Bibehåll besökarnas intresse med relaterat innehåll längst ner på varje inlägg. Dessa inställningar gäller inte {{a}}relaterade inlägg som läggs till med blockredigeraren{{/a}}."
+
+#: _inc/jetpack-strings.php:436
+msgid "The feature helps visitors find more of your content by displaying related posts at the bottom of each post."
+msgstr "Med den här funktionen hittar besökarna mer av ditt innehåll genom att visa relaterade inlägg längst ner på varje inlägg."
+
+#: _inc/jetpack-strings.php:427
+msgid "Jetpack automatically generates a custom {{link1}}ads.txt{{/link1}} tailored for your site. If you need to add additional entries for other networks please add them in the space below, one per line. {{link2}}Check here for more details{{/link2}}."
+msgstr "Jetpack genererar automatiskt en anpassad {{link1}}ads.txt{{/link1}} som är skräddarsydd för din webbplats. Om du behöver lägga till ytterligare poster för andra nätverk så lägger du till dem i utrymmet nedan, en per rad. {{link2}}Läs här för mer information{{/link2}}."
+
+#: _inc/jetpack-strings.php:410
+msgid "Add sharing buttons so visitors can share your posts and pages on social media with a couple of quick clicks."
+msgstr "Lägg till delningsknappar så att besökare kan dela dina inlägg och sidor på sociala medier med ett par snabba klick."
+
+#: _inc/jetpack-strings.php:409
+msgid "You can customize the sharing buttons and choose which services to display."
+msgstr "Du kan anpassa delningsknapparna och välja vilka tjänster som ska visas."
+
+#: _inc/jetpack-strings.php:411
+msgid "Add sharing buttons to your posts and pages"
+msgstr "Lägg till delningsknappar i dina inlägg och sidor"
+
+#: _inc/jetpack-strings.php:394
+msgid "Share your content to social media, reaching new audiences and increasing engagement."
+msgstr "Dela ditt innehåll på sociala medier och nå ut till nya målgrupper och engagera fler personer."
+
+#: _inc/jetpack-strings.php:386
+msgctxt "Settings header, noun."
+msgid "WordPress.com login"
+msgstr "WordPress.com-inloggning"
+
+#: _inc/jetpack-strings.php:378
+msgid "Get alerts if your site goes offline. We’ll let you know when it’s back up, too."
+msgstr "Få aviseringar om din webbplats är nere. Vi informerar dig också när de är igång igen."
+
+#: _inc/jetpack-strings.php:375
+msgid "With Jetpack you can choose to have your plugins auto-updated with each new plugin release. You’ll get the latest security and bug fixes right away, ensuring your site stays secure."
+msgstr "Med Jetpack kan du välja att uppdatera dina tillägg automatiskt vid lanseringen av varje nytt tillägg. Du får de senaste säkerhetsuppdateringarna och buggfixarna direkt, så att din webbplats alltid är säker."
+
+#: _inc/jetpack-strings.php:372
+msgid "Your site is protected by Jetpack. You’ll be notified if anything needs attention."
+msgstr "Din webbplats är skyddad av Jetpack. Du kommer att bli underrättad om något behöver uppmärksamhet."
+
+#: _inc/jetpack-strings.php:374
+msgctxt "Settings header"
+msgid "Auto-update plugins"
+msgstr "Automatisk uppdatering av tillägg"
+
+#: _inc/jetpack-strings.php:373
+msgid "Choose which plugins to auto-update"
+msgstr "Välj vilka tillägg som ska uppdateras automatiskt"
+
+#: _inc/jetpack-strings.php:343
+msgctxt "Settings header"
+msgid "Jetpack Anti-spam"
+msgstr "Jetpack Anti-spam"
+
+#: _inc/jetpack-strings.php:277
+msgid "Upgrade Jetpack now"
+msgstr "Uppgradera Jetpack nu"
+
+#: _inc/jetpack-strings.php:276
+msgid "Monetize your site by running high quality ads."
+msgstr "Tjäna pengar på din webbplats genom att visa reklam av hög kvalitet."
+
+#: _inc/jetpack-strings.php:275
+msgid "Customize your social posting schedule."
+msgstr "Anpassa ditt schema för inlägg på sociala medier."
+
+#: _inc/jetpack-strings.php:274
+msgid "Expand your audience with pro SEO tools."
+msgstr "Utöka din målgrupp med professionella verktyg för sökmotorsoptimering."
+
+#: _inc/jetpack-strings.php:273
+msgid "Resolve issues quickly with priority support."
+msgstr "Lös problem snabbt med prioriterad support."
+
+#: _inc/jetpack-strings.php:272
+msgid "Get peace of mind with automated backups."
+msgstr "Slipp oroa dig med automatisk säkerhetskopia."
+
+#: _inc/jetpack-strings.php:271
+msgid "Take your site to the next level!"
+msgstr "Ta din webbplats till nästa nivå!"
+
+#: _inc/jetpack-strings.php:270
+msgid "Search support docs"
+msgstr "Sök supportdokument"
+
+#: _inc/jetpack-strings.php:269
+msgid "Need help? Learn about getting started, customizing your site, using advanced code snippets, and more."
+msgstr "Behöver du hjälp? Lär dig om att komma igång, anpassa din webbplats, använda avancerade kodsegment med mera."
+
+#: _inc/jetpack-strings.php:262
+msgid "Start sharing"
+msgstr "Börja dela"
+
+#: _inc/jetpack-strings.php:201 _inc/jetpack-strings.php:252
+msgid "Optimized performance"
+msgstr "Optimerad prestanda"
+
+#: _inc/jetpack-strings.php:181
+msgid "Enable the “subscribe to comments” option on your comment form"
+msgstr "Aktivera alternativet ”prenumerera på kommentarer” i ditt kommentarsformulär"
+
+#: _inc/jetpack-strings.php:180
+msgid "Enable the “subscribe to site” option on your comment form"
+msgstr "Aktivera alternativet ”prenumerera på webbplats” i ditt kommentarsformulär"
+
+#: _inc/jetpack-strings.php:132
+msgid "Protect"
+msgstr "Skydda"
+
+#: _inc/jetpack-strings.php:138
+msgid "Scan"
+msgstr "Skanna"
+
+#: _inc/jetpack-strings.php:148
+msgid "Find threats early so we can help fix them fast."
+msgstr "Hitta hot tidigt så att vi kan hjälpa till att åtgärda dem snabbt."
+
+#: _inc/jetpack-strings.php:159
+msgid "Replace your site's basic search with customizable search that helps visitors find answers faster."
+msgstr "Ersätt webbplatsens grundläggande sökning med anpassningsbar sökning som hjälper besökare att hitta svar snabbare."
+
+#: _inc/jetpack-strings.php:176
+msgid "Manage advanced comment settings and grow your audience with email subscriptions."
+msgstr "Hantera avancerade inställningar för kommentarer och få en större målgrupp med e-postprenumerationer."
+
+#: _inc/jetpack-strings.php:167
+msgid "Comment form introduction"
+msgstr "Introduktion till kommentarsformulär"
+
+#: _inc/jetpack-strings.php:93
+msgid "Never worry about losing your site – automatic backups keep your content safe."
+msgstr "Sluta oroa dig för att förlora din webbplats – med automatiska säkerhetskopior är ditt innehåll säkert."
+
+#: _inc/jetpack-strings.php:83
+msgid "Automatically clear spam from your comments and forms so you can get back to your business."
+msgstr "Rensa automatiskt skräppost från dina kommentarer och formulär, så att du kan ägna dig åt viktigare saker."
+
+#: _inc/jetpack-strings.php:80
+msgid "Jetpack Anti-spam powered by Akismet. Comments and contact form submissions are checked against our global database of spam."
+msgstr "Jetpack Anti-spam från Akismet. Kommentarer och inlägg i kontaktformuläret granskas mot vår globala skräppostdatabas."
+
+#: _inc/jetpack-strings.php:79
+msgid "Anti-spam"
+msgstr "Anti-spam"
+
+#: _inc/jetpack-strings.php:48
+msgid "Failed to send login email"
+msgstr "Det gick inte att skicka e-post för inloggning"
+
+#: _inc/jetpack-strings.php:47
+msgid "Login email sent"
+msgstr "E-post för inloggning har skickats"
+
+#: _inc/jetpack-strings.php:46
+msgid "Sending login email…"
+msgstr "Skickar e-post för inloggning..."
+
+#: _inc/jetpack-strings.php:28
+msgid "Your plan: Jetpack Professional"
+msgstr "Ditt paket: Jetpack Professional"
+
+#: _inc/jetpack-strings.php:25
+msgid "Your plan: Jetpack Premium"
+msgstr "Ditt paket: Jetpack Premium"
+
+#: _inc/jetpack-strings.php:21
+msgid "Your plan: Jetpack Personal"
+msgstr "Ditt paket: Jetpack Personal"
+
+#: _inc/jetpack-strings.php:19
+msgid "Worried about security? Get backups, automated security fixes and more: {{a}}Upgrade now{{/a}}"
+msgstr "Oroad för säkerheten? Få säkerhetskopiering, automatiska säkerhetsuppdateringar med mera: {{a}}Uppgradera nu{{/a}}"
+
+#: _inc/jetpack-strings.php:18
+msgid "Your plan: Jetpack Free"
+msgstr "Ditt paket: Jetpack Free"
+
+#: modules/module-headings.php:187
+msgctxt "Module Description"
+msgid "Let visitors subscribe to new posts and comments via email"
+msgstr "Låt besökare prenumerera på nya inlägg och kommentarer via e-post"
+
+#: modules/module-headings.php:132
+msgctxt "Module Description"
+msgid "Enabling brute force protection will prevent bots and hackers from attempting to log in to your website with common username and password combinations."
+msgstr "Med skydd mot brute force-attacker kan programvara och hackers inte logga in på din webbplats med kombinationer av vanliga användarnamn och lösenord."
+
+#: modules/module-headings.php:37
+msgctxt "Module Description"
+msgid "Enable the option to copy entire posts and pages, including tags and settings"
+msgstr "Aktivera alternativet att kopiera hela inlägg och sidor, inklusive etiketter och inställningar"
+
+#: modules/masterbar/masterbar.php:942
+msgctxt "admin bar menu group label"
+msgid "Manage"
+msgstr "Hantera"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Upgrade Your Plan"
+msgstr "Uppgradera ditt paket"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Recurring Payments button"
+msgstr "Återkommande betalningar-knappen"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "See your earnings, subscriber list, and products."
+msgstr "Se dina intäkter, din prenumerantlista och dina produkter."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "%s / %s"
+msgstr "%s / %s"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "%s / year"
+msgstr "%s/år"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "%s / month"
+msgstr "%s/månad"
+
+#. translators: %1$d is a number, %2$s is the name of an option.
+#: class.jetpack-cli.php:408
+msgid "Deleted %1$d %2$s options"
+msgstr "Tog bort %1$d %2$s alternativ"
+
+#: class.jetpack-cli.php:395 class.jetpack-cli.php:416
+msgid "No options were deleted."
+msgstr "Inga alternativ togs bort."
+
+#. translators: %1$d is a number, %2$s is the name of an option, %2$s is the
+#. site URL.
+#: class.jetpack-cli.php:367
+msgid "Deleted %1$d %2$s options from %3$s"
+msgstr "Tog bort %1$d %2$s alternativ från %3$s"
+
+#: class.jetpack-cli.php:338
+msgid "Please specify if you would like to reset your options, modules or sync-checksum"
+msgstr "Ange om du vill återställa dina alternativ, moduler eller synk-kontrollsumma"
+
+#: class.jetpack-cli.php:279
+msgid ""
+"The following messages will give you preview of what will happen when you run this command.\n"
+"\n"
+msgstr ""
+"Följande meddelanden ger dig en förhandsvisning av vad som händer när du kör kommandot.\n"
+"\n"
+
+#: class.jetpack-cli.php:278
+msgid "No actions will be taken.\n"
+msgstr "Inga åtgärder kommer att vidtas.\n"
+
+#: class.jetpack-cli.php:277
+msgid ""
+"\n"
+"This is a dry run.\n"
+msgstr ""
+"\n"
+"Detta är en testkörning.\n"
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:461
+msgid "Plugin icon"
+msgstr "Tilläggsikon"
+
+#: modules/comments/comments.php:490
+msgid "Unknown security token."
+msgstr "Okänd säkerhetstoken."
+
+#: modules/shortcodes/soundcloud.php:43
+msgid "Please specify a Soundcloud URL."
+msgstr "Ange en Soundcloud-URL."
+
+#. translators: URL to Wufoo support page.
+#: modules/shortcodes/wufoo.php:42
+msgid "Something is wrong with your Wufoo shortcode. Try following the instructions here to embed a form on your site."
+msgstr "Något blev fel med din kortkod för Wufoo. Försök med instruktionerna här för att bädda in ett formulär på din webbplats."
+
+#: modules/shortcodes/medium.php:85
+msgid "You did not provide a valid Medium URL."
+msgstr "Du tillhandahöll inte en giltig Medium-URL."
+
+#: modules/shortcodes/medium.php:68
+msgid "View at Medium.com"
+msgstr "Visa på Medium.com"
+
+#: modules/shortcodes/medium.php:49
+msgid "View this collection on Medium.com"
+msgstr "Visa denna samling på Medium.com"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "You'll need to upgrade your plan to use the Recurring Payments button."
+msgstr "Du måste uppgradera ditt paket för att använda Återkommande betalningar-knappen."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Recurring Payments"
+msgstr "Återkommande betalningar"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Management"
+msgstr "Hantering"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Payment plan"
+msgstr "Betalningsplan"
+
+#: modules/memberships/class-jetpack-memberships.php:141
+msgid "Recurring Payments plans"
+msgstr "Återkommande betalningar-planer"
+
+#. translators: %1$s is the name of an option, %2$d is a number of sites.
+#: class.jetpack-cli.php:389
+msgid "Successfully reset %1$s on %2$d sites."
+msgstr "Återställde %1$s på %2$d webbplatser."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Read more about Recurring Payments and related fees."
+msgstr "Läs mer om återkommande betalningar och relaterade avgifter."
+
+#. translators: Placeholders are numbers, versions of PHP in use on the site,
+#. and required by Jetpack.
+#: jetpack.php:99
+msgid "Your version of PHP (%1$s) is lower than the version required by Jetpack (%2$s). Please update PHP to continue enjoying Jetpack."
+msgstr "Din version av PHP (%1$s) är lägre än den version som krävs av Jetpack (%2$s). Uppdatera PHP för att fortsätta med Jetpack."
+
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:248
+msgid "The WordPress.com API returned a 404 error."
+msgstr "WordPress.com returnerade ett 404-felmeddelande."
+
+#: _inc/lib/admin-pages/class.jetpack-admin-page.php:394
+msgid "About"
+msgstr "Om"
+
+#: _inc/lib/class.core-rest-api-endpoints.php:1484
+msgid "No activity found"
+msgstr "Ingen aktivitet hittades"
+
+#: _inc/lib/class.core-rest-api-endpoints.php:1474
+msgid "Could not retrieve site activity."
+msgstr "Det gick inte att hämta webbplatsaktivitet."
+
+#: _inc/lib/class.core-rest-api-endpoints.php:1458
+msgid "Site ID is missing."
+msgstr "Webbplats-ID saknas."
+
+#: _inc/jetpack-strings.php:174
+msgid "Allow readers to like individual comments."
+msgstr "Tillåt läsare att gilla enskilda kommentarer."
+
+#: _inc/jetpack-strings.php:173
+msgid "Enable comment likes."
+msgstr "Aktivera gilla-funktionen på kommentarer."
+
+#: _inc/jetpack-strings.php:172
+msgid "Allow readers to use markdown in comments."
+msgstr "Låt läsarna använda märkspråk i kommentarer."
+
+#: _inc/jetpack-strings.php:170
+msgid "Show Gravatar hovercards alongside comments."
+msgstr "Visa Gravatar-hovercards vid kommentarer."
+
+#. translators: Text on link to list of onboarding tasks
+#: _inc/jetpack-strings.php:72
+msgid "Complete Jetpack Setup"
+msgstr "Slutför installationen av Jetpack"
+
+#. translators: Onboarding task list progress
+#: _inc/jetpack-strings.php:70
+msgid "Your Jetpack setup progress"
+msgstr "Ditt Jetpack-konfigurationsförlopp"
+
+#: _inc/jetpack-strings.php:16
+msgid "View your setup checklist"
+msgstr "Visa kontrolllistan för konfiguration"
+
+#. translators: Placeholder is a link to a support document.
+#: jetpack.php:169
+msgid "Your installation of Jetpack is incomplete. If you installed Jetpack from GitHub, please refer to this document to set up your development environment."
+msgstr "Din installation av Jetpack är ofullständig. Om du har installerat Jetpack från GitHub hänvisas till det här dokumentet för att konfigurera din utvecklingsmiljö."
+
+#: jetpack.php:122
+msgid "Learn more about updating PHP"
+msgstr "Lär dig mer om uppdatering av PHP"
+
+#: jetpack.php:116
+msgid "Jetpack requires a more recent version of PHP and has been paused. Please update PHP to continue enjoying Jetpack."
+msgstr "Jetpack kräver en senare version av PHP och har pausats. Uppdatera PHP för att fortsätta med Jetpack."
+
+#. translators: Placeholders are numbers, versions of WordPress in use on the
+#. site, and required by WordPress.
+#: jetpack.php:60
+msgid "Your version of WordPress (%1$s) is lower than the version required by Jetpack (%2$s). Please update WordPress to continue enjoying Jetpack."
+msgstr "Din version av WordPress (%1$s) är lägre än den version som krävs av Jetpack (%2$s). Uppdatera WordPress för att fortsätta att använda Jetpack."
+
+#: modules/wpcom-block-editor/class-jetpack-wpcom-block-editor.php:144
+msgid "Logging In..."
+msgstr "Loggar in..."
+
+#: modules/wpcom-block-editor/class-jetpack-wpcom-block-editor.php:129
+msgid "Before we continue, please log in to your Jetpack site."
+msgstr "Logga in på din Jetpack-webbplats innan vi går vidare."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "Connected"
+msgstr "Ansluten"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "Linked"
+msgstr "Länkad"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "subscription"
+msgstr "prenumeration"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid " Contribution"
+msgstr " Bidrag"
+
+#: _inc/jetpack-strings.php:309 _inc/blocks/editor-beta.js:24
+#: _inc/blocks/editor.js:24
+msgid "Yearly"
+msgstr "Årligen"
+
+#: _inc/jetpack-strings.php:308 _inc/blocks/editor-beta.js:24
+#: _inc/blocks/editor.js:24
+msgid "Monthly"
+msgstr "Månadsvis"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Renew interval"
+msgstr "Förnya intervall"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Subscription description"
+msgstr "Prenumerationsbeskrivning"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Describe your subscription in a few words"
+msgstr "Beskriv din prenumeration med några få ord"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Button allowing you to sell subscription products."
+msgstr "Knapp som gör det möjligt att sälja prenumerationsprodukter"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "newsletter"
+msgstr "nyhetsbrev"
+
+#: _inc/blocks/editor-beta.js:24
+msgid "Write a description…"
+msgstr "Skriv en beskrivning…"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "Similar content"
+msgstr "Liknande innehåll"
+
+#: _inc/blocks/editor-beta.js:24
+msgid "SEO Description"
+msgstr "SEO-beskrivning"
+
+#: _inc/blocks/editor-beta.js:24
+msgid "%d character"
+msgid_plural "%d characters"
+msgstr[0] "%d tecken"
+msgstr[1] "%d tecken"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Preview unavailable: you haven't published enough posts with similar content."
+msgstr "Förhandsvisning ej tillgänglig: du har inte publicerat tillräckligt många inlägg med liknande innehåll."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "A form enabling readers to join a Mailchimp list."
+msgstr "Ett formulär som gör det möjligt för läsare att gå med i en Mailchimp-lista"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Write consent text"
+msgstr "Skriv text om samtycke"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "You can edit the email placeholder in the sidebar."
+msgstr "Du kan redigera e-postens platshållare i sidopanelen."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Manage Connection"
+msgstr "Hantera anslutning"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Mailchimp Connection"
+msgstr "Mailchimp-anslutning"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Error text"
+msgstr "Feltext"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Success text"
+msgstr "Lyckades-text"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Processing text"
+msgstr "Bearbetar text"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Email Placeholder"
+msgstr "E-postplatshållare"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Text Elements"
+msgstr "Textelement"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Re-check Connection"
+msgstr "Kontrollera anslutningen igen"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Icon for image"
+msgstr "Ikon för bild"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Grey square"
+msgstr "Grå fyrkant"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Shortlink"
+msgstr "Kortlänk"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "In “Uncategorized”"
+msgstr "I ”Okategoriserad”"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "August 3, 2018"
+msgstr "3 augusti 2018"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Placeholder image"
+msgstr "Platshållarbild"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Set up Mailchimp form"
+msgstr "Ställ in Mailchimp-formulär"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "You need to connect your Mailchimp account and choose a list in order to start collecting Email subscribers."
+msgstr "Du måste ansluta ditt Mailchimp-konto och välja en lista för att börja samla e-postprenumeranter."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Display thumbnails"
+msgstr "Visa miniatyrer"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "List View"
+msgstr "Listvy"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Grid View"
+msgstr "Rutnätsvy"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Number of posts"
+msgstr "Antal inlägg"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Related Posts Settings"
+msgstr "Inställningar för relaterade inlägg"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Display context (category or tag)"
+msgstr "Visa kontext (kategori eller etikett)"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "markup"
+msgstr "kodredigering"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "syntax"
+msgstr "syntax"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "giphy"
+msgstr "giphy"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "visitors"
+msgstr "besökare"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "return"
+msgstr "återvänd"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "image"
+msgstr "bild"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "formatting"
+msgstr "formatering"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "follow"
+msgstr "följ"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "subscribe"
+msgstr "prenumerera"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "animated"
+msgstr "animerad"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Mailchimp"
+msgstr "Mailchimp"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "visibility"
+msgstr "synlighet"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Control block visibility based on how often a visitor has viewed the page."
+msgstr "Kontrollblockets synlighet baserat på hur ofta en besökare har tittat på sidan."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Please enter a valid number."
+msgstr "Vänligen ange ett giltigt nummer."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Advertisement"
+msgstr "Annons"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Learn all about WordAds"
+msgstr "Lär dig allt om WordAds"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Earn income by adding high quality ads to your post"
+msgstr "Tjäna pengar genom att lägga till annonser av hög kvalitet till ditt inlägg"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Hide ad on mobile views"
+msgstr "Dölj annons i mobila vyer"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "business is closed on a full day"
+msgid "Closed"
+msgstr "Stängd"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "schedule"
+msgstr "tidsinställ"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "closing time"
+msgstr "stängningstid"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "opening hours"
+msgstr "öppettider"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Add an interactive slideshow."
+msgstr "Lägg till ett interaktivt bildspel."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Visit count threshold"
+msgstr "Besöksantalsgräns"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Repeat Visitor"
+msgstr "Återkommande besökare"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "This block will only appear to people who have visited this page more than once."
+msgid_plural "This block will only appear to people who have visited this page more than %d times."
+msgstr[0] "Detta block visas bara för personer som har besökt sidan minst en gång tidigare."
+msgstr[1] "Detta block visas bara för personer som har besökt sidan minst %d gånger tidigare."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Show after threshold"
+msgstr "Visa efter gräns"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Show before threshold"
+msgstr "Visa före gräns"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "This block will only appear to people who are visiting this page for the first time."
+msgid_plural "This block will only appear to people who have visited this page at most %d times."
+msgstr[0] "Detta block visas bara för personer som besöker denna sida för första gången."
+msgstr[1] "Detta block kommer bara att visas för personer som har besökt denna sida högst %d gånger."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Effects"
+msgstr "Effekter"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Edit Slideshow"
+msgstr "Redigera bildspel"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Drag images, upload new ones or select files from your library."
+msgstr "Dra bilder, ladda upp nya eller välj filer från ditt bibliotek."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Pick an ad format"
+msgstr "Välj ett annonsformat"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Rectangle 300x250"
+msgstr "Rektangel 300x250"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Wide Skyscraper 160x600"
+msgstr "Bred Skyscraper 160x600"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Mobile Leaderboard 320x50"
+msgstr "Mobil Leaderboard 320x50"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Leaderboard 728x90"
+msgstr "Rankningslista 728x90"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Edit video"
+msgstr "Redigera video"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Uploading…"
+msgstr "Laddar upp ..."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Transition effect"
+msgstr "Övergångseffekt"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "The Reduce Motion accessibility option is selected, therefore autoplay will be disabled in this browser."
+msgstr "Alternativet Minska rörelseåtkomst är valt, så automatisk uppspelning kommer att inaktiveras i den här webbläsaren."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Friday"
+msgstr "Fredag"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Sunday"
+msgstr "Söndag"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Thursday"
+msgstr "Torsdag"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Wednesday"
+msgstr "Onsdag"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Tuesday"
+msgstr "Tisdag"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Monday"
+msgstr "Måndag"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Saturday"
+msgstr "Lördag"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Add Hours"
+msgstr "Lägg till timmar"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Display opening hours for your business."
+msgstr "Visa öppettider för ditt företag."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Business Hours"
+msgstr "Öppettider"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Loading business hours"
+msgstr "Läser in öppettider"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Closing"
+msgstr "Stänger"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Opening"
+msgstr "Öppnar"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Open"
+msgstr "Öppen"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Subscriber count unavailable"
+msgstr "Prenumerantantal är inte tillgängligt"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Show total subscribers"
+msgstr "Visa totalt antal prenumeranter"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Search for and insert an animated image."
+msgstr "Sök efter och infoga en animerad bild."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "ads"
+msgstr "annonser"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Ad"
+msgstr "Annons"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "GIF"
+msgstr "GIF"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Write caption…"
+msgstr "Skriv bildtext…"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Search for a term or paste a Giphy URL"
+msgstr "Sök efter en term eller klistra in en Giphy-URL"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "gallery"
+msgstr "galleri"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "slider"
+msgstr "slider"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "join"
+msgstr "gå med"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "A form enabling readers to get notifications when new posts are published from this site."
+msgstr "Ett formulär som låter läsare få meddelanden när nya webbplatsen publicerar nya inlägg."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Subscription Form"
+msgstr "Prenumerationsformulär"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Are you sure you wish to leave this page?"
+msgstr "Är du säker på att du vill lämna denna sida?"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Use regular characters and punctuation to style text, links, and lists."
+msgstr "Använd vanliga tecken och skiljetecken för att skriva text, länkar och listor."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Write your _Markdown_ **here**…"
+msgstr "Skriv din _Markdown_ **här**…"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "sell"
+msgstr "sälj"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "shop"
+msgstr "butik"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Delay between transitions (in seconds)"
+msgstr "Fördröjning mellan övergångar (i sekunder)"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "The Swiper library could not be loaded."
+msgstr "Swiper-biblioteket kunde inte hämtas."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Lets you create and embed credit and debit card payment buttons with minimal setup."
+msgstr "Låter dig skapa och bädda in knappar för betalning med kredit- och betalkort med minimal konfiguration."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Create one on PayPal"
+msgstr "Skapa en på PayPal"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Enter the email address associated with your PayPal account. Don’t have an account?"
+msgstr "Ange e-postadressen som är kopplad till ditt PayPal-konto. Har du inget konto?"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "Slideshow transition effect"
+msgid "Fade"
+msgstr "Tona"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "Slideshow transition effect"
+msgid "Slide"
+msgstr "Bild"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Autoplay"
+msgstr "Spela upp automatiskt"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Autoplay between slides"
+msgstr "Automatisk uppspelning mellan bilder"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Simple Payments button"
+msgstr "Enkel betalningsknapp"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Support reference"
+msgstr "Supportreferens"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Describe your item in a few words"
+msgstr "Beskriv ditt objekt med några ord"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Invalid price."
+msgstr "Ogiltigt pris."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Currency"
+msgstr "Valuta"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Allow people to buy more than one item at a time"
+msgstr "Låt folk köpa mer än en sak åt gången."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Item name"
+msgstr "Objektnamn"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Please add a brief title so that people know what they’re paying for."
+msgstr "Lägg till en kort rubrik så att folk vet vad de betalar för."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "If you’re selling something, you need a price tag. Add yours here."
+msgstr "Om du säljer något behöver du en prislapp. Lägg till din här."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "We know every penny counts, but prices in this currency can’t contain decimal values."
+msgstr "Vi vet att varje öre räknas, men priserna i den här valutan kan inte innehålla decimaler."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "The price cannot have more than %d decimal place."
+msgid_plural "The price cannot have more than %d decimal places."
+msgstr[0] "Priset kan inte ha mer än %d decimal."
+msgstr[1] "Priset kan inte ha mer än %d decimaler."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Your price is negative — enter a positive number so people can pay the right amount."
+msgstr "Ditt pris är negativt — ange ett positivt värde så att folk kan betala rätt summa."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Add a marker…"
+msgstr "Lägg till en markör…"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Edit Image"
+msgstr "Redigera bild"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Product Image"
+msgstr "Produktbild"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Choose"
+msgstr "Välj"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Confirm"
+msgstr "Bekräfta"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Choose Multiple"
+msgstr "Välj flera"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Accept"
+msgstr "Acceptera"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Compact, but powerful. Add a select box with several items."
+msgstr "Kompakt, men kraftfullt. Lägg till en valruta med flera objekt."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Dropdown"
+msgstr "Rullgardinsmeny"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Select"
+msgstr "Välj"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "People love options. Add several checkbox items."
+msgstr "Folk älskar alternativ. Lägg till flera kryssruteobjekt."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Checkbox Group"
+msgstr "Kryssrutegrupp"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Add a single checkbox."
+msgstr "Lägg till en enstaka kryssruta."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Let folks speak their mind. This text box is great for longer responses."
+msgstr "Låt folk säga vad de tycker. Den här textrutan är bra för längre svar."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Inspired by radios, only one radio item can be selected at a time. Add several radio button items."
+msgstr "Med inspiration från radion, man kan bara välja ett radioobjekt åt gången. Lägg till flera radioknappsobjekt."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "No results."
+msgstr "Inga resultat."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Colors"
+msgstr "Färger"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Show street names"
+msgstr "Visa gatunamn"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Map Theme"
+msgstr "Karttema"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Add a location"
+msgstr "Lägg till en plats"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Add marker"
+msgstr "Lägg till markör"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Markers"
+msgstr "Markörer"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "%d result found, use up and down arrow keys to navigate."
+msgid_plural "%d results found, use up and down arrow keys to navigate."
+msgstr[0] "%d resultat hittades, använd upp och nedpilarna för att navigera."
+msgstr[1] "%d resultat hittades, använd upp och nedpilarna för att navigera."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Create an account or log in to Mapbox."
+msgstr "Skapa ett konto eller logga in på Mapbox."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Set Token"
+msgstr "Ange token"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Paste Token Here"
+msgstr "Klistra in token här"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Locate and copy the default access token. Then, paste it into the field below."
+msgstr "Identifiera och kopiera åtkomsttoken. Klistra sedan in den i nedanstående fält."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "To use the map block, you need an Access Token."
+msgstr "Du behöver en åtkomsttoken för att använda kartblock."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Remove Token"
+msgstr "Ta bort token"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Update Token"
+msgstr "Uppdatera token"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Mapbox Access Token"
+msgstr "Åtkomsttoken för Mapbox"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Pay with PayPal"
+msgstr "Betala med PayPal"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "contact"
+msgstr "kontakt"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "feedback"
+msgstr "feedback"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Telephone"
+msgstr "Telefon"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Mobile"
+msgstr "Mobil"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Cellular phone"
+msgstr "Mobiltelefon"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Calendar"
+msgstr "Kalender"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Date Picker"
+msgstr "Datumväljare"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "The best way to set a date. Add a date picker."
+msgstr "Det bästa sättet att ställa in ett datum. Lägg till en datumväljare."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "day month year"
+msgstr "dag månad år"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Multiline text"
+msgstr "Text med flera rader"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Add a phone number input."
+msgstr "Lägg till en inmatning för telefonnummer."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Add an address input for a website."
+msgstr "Lägg till en adressinmatning för en webbplats."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "internet page"
+msgstr "internetsida"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Want to reply to folks? Add an email address input."
+msgstr "Vill du kunna svara på folks kommentarer? Lägg till en e-postadressinmatning."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "mail"
+msgstr "E-post"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "A simple way to get feedback from folks visiting your site."
+msgstr "Ett enkelt sätt att få återkoppling från folk som besöker din webbplats."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Introductions are important. Add an input for folks to add their name."
+msgstr "Introduktioner är viktiga. Lägg till en inmatning där folk kan lägga till sitt namn."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "When you need just a small amount of text, add a text input."
+msgstr "När du bara behöver en liten textmängd, lägg till en textimatning."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "%s is not a valid email address."
+msgstr "%s är inte en giltig e-postadress."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Default Checked State"
+msgstr "Markerat standardtillstånd"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "ID"
+msgstr "ID"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Default Value"
+msgstr "Standardvärde"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Add option"
+msgstr "Lägg till alternativ"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Insert option"
+msgstr "Infoga alternativ"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Remove option"
+msgstr "Ta bort alternativ"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Write label…"
+msgstr "Skriv etikett…"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Field Settings"
+msgstr "Fältinställningar"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Write option…"
+msgstr "Skriv alternativ…"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "You can enter multiple email addresses separated by commas."
+msgstr "Du kan ange flera e-postadresser separerade med kommatecken."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Required"
+msgstr "Obligatorisk"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Set the placeholder text"
+msgstr "Ställ in platshållartext"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "You’ll receive an email notification each time someone fills out the form. Where should it go, and what should the subject line be?"
+msgstr "Du kommer att få en e-postavisering varje gång någon fyller i formuläret. Vart ska den skickas, och vad ska ämnesraden vara?"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Add form"
+msgstr "Lägg till formulär"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "(If you leave these blank, notifications will go to the author with the post or page title as the subject line.)"
+msgstr "(Om du lämnar dessa fält tomma kommer aviseringar att skickas till författaren med inläggets eller sidans titel som ämnesrad.)"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Email address"
+msgstr "E-postadress"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "name@example.com"
+msgstr "namn@exempel.com"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Form"
+msgstr "Formulär"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Let's work together"
+msgstr "Låt oss arbeta tillsammans"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "%s and %s are not a valid email address."
+msgstr "%s och %s är inte en giltig e-postadress."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Email subject line"
+msgstr "Ämnesrad för e-post"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "%s are not a valid email address."
+msgstr "%s är inte en giltig e-postadress."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Email Feedback Settings"
+msgstr "Inställningar för feedback via e-post"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "photos"
+msgstr "foton"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "address"
+msgstr "adress"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "phone"
+msgstr "telefon"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "message"
+msgstr "meddelande"
+
+#: _inc/blocks/editor-beta.js:12 _inc/blocks/map/view.js:1
+#: _inc/blocks/editor.js:12
+msgctxt "block search term"
+msgid "map"
+msgstr "karta"
+
+#: _inc/blocks/editor-beta.js:20 _inc/blocks/editor.js:20
+msgid "Likes and Sharing"
+msgstr "Gilla & Dela"
+
+#: _inc/blocks/editor-beta.js:12 _inc/blocks/map/view.js:1
+#: _inc/blocks/editor.js:12
+msgctxt "block search term"
+msgid "navigation"
+msgstr "navigering"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "image style"
+msgid "Original"
+msgstr "Original"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Pick an image filter"
+msgstr "Välj ett bildfilter"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "image style"
+msgid "Black and White"
+msgstr "Svart och vit"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "image style"
+msgid "Sepia"
+msgstr "Sepia"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "image style"
+msgid "Gingham"
+msgstr "Gingham"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "image style"
+msgid "Clarendon"
+msgstr "Clarendon"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Open address in Google Maps"
+msgstr "Öppna adress i Google Maps"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Write a message for your audience here. If you leave this blank, we'll use the post title as the message."
+msgstr "Skriv ett meddelande här för din publik. Om du lämnar detta tomt använder vi posttiteln som meddelandet."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Columns"
+msgstr "Kolumner"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Edit Gallery"
+msgstr "Redigera galleri"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Remove Image"
+msgstr "Ta bort bild"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Upload an image"
+msgstr "Ladda upp en bild"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Link To"
+msgstr "Länk till"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Tiled Gallery settings"
+msgstr "Inställningar för mosaikgalleri"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "place"
+msgstr "plats"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "mobile"
+msgstr "mobil"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "telephone"
+msgstr "telefon"
+
+#: _inc/blocks/editor-beta.js:12 _inc/blocks/editor.js:12
+msgid "Text Color"
+msgstr "Textfärg"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Connect an account"
+msgstr "Anslut ett konto"
+
+#: _inc/blocks/editor-beta.js:12 _inc/blocks/editor.js:12
+msgid "Add text…"
+msgstr "Lägg till text…"
+
+#: _inc/blocks/editor-beta.js:12 _inc/blocks/map/view.js:1
+#: _inc/blocks/editor.js:12
+msgid "Terrain"
+msgstr "Terräng"
+
+#: _inc/blocks/editor-beta.js:12 _inc/blocks/map/view.js:1
+#: _inc/blocks/editor.js:12
+msgid "Satellite"
+msgstr "Satellit"
+
+#: _inc/blocks/editor-beta.js:12 _inc/blocks/map/view.js:1
+#: _inc/blocks/editor.js:12
+msgid "Black and white"
+msgstr "Svart och vit"
+
+#: _inc/blocks/editor-beta.js:12 _inc/blocks/map/view.js:1
+#: _inc/blocks/editor.js:12
+msgid "Basic"
+msgstr "Grundläggande"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Phone Number"
+msgstr "Telefonnummer"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Phone number"
+msgstr "Telefonnummer"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/map/view.js:1
+#: _inc/blocks/editor.js:24
+msgid "Delete Marker"
+msgstr "Ta bort markör"
+
+#: _inc/blocks/editor-beta.js:12 _inc/blocks/map/view.js:1
+#: _inc/blocks/editor.js:12
+msgid "Add an interactive map showing one or more locations."
+msgstr "Lägg till en interaktiv karta som visar en eller flera platser."
+
+#: _inc/blocks/editor-beta.js:12 _inc/blocks/editor-beta.js:24
+#: _inc/blocks/map/view.js:1 _inc/blocks/editor.js:12 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "location"
+msgstr "plats"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "direction"
+msgstr "riktning"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "Tiled gallery layout"
+msgid "Circles"
+msgstr "Cirklar"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Tiled Gallery"
+msgstr "Mosaikgalleri"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Connect and select the accounts where you'd like to share your post."
+msgstr "Anslut och välj de konton där du vill dela ditt inlägg."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/map/view.js:1
+#: _inc/blocks/editor.js:24
+msgid "Marker Caption"
+msgstr "Tidsmarkörstext"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/map/view.js:1
+#: _inc/blocks/editor.js:24
+msgid "Marker Title"
+msgstr "Tidsmarkörstitel"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "cell"
+msgstr "cell"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Lets you add a phone number with an automatically generated click-to-call link."
+msgstr "Låter dig lägga till ett telefonnummer med en automatiskt genererad samtalslänk."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "images"
+msgstr "bilder"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "email"
+msgstr "e-post"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "Tiled gallery layout"
+msgid "Tiled columns"
+msgstr "kolumner sida vid sida"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "Tiled gallery layout"
+msgid "Square tiles"
+msgstr "rutor sida vid sida"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "Tiled gallery layout"
+msgid "Tiled mosaic"
+msgstr "mosaik sida vid sida"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgctxt "block search term"
+msgid "pictures"
+msgstr "bilder"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Display multiple images in an elegantly organized tiled layout."
+msgstr "Visa flera bilder i en elegant organiserad layout."
+
+#: _inc/blocks/editor-beta.js:12 _inc/blocks/editor.js:12
+msgid "Button Color Settings"
+msgstr "Knappens färginställningar"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Address"
+msgstr "Adress"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Country"
+msgstr "Land"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "City"
+msgstr "Ort"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Address Line 3"
+msgstr "Adressrad 3"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Address Line 2"
+msgstr "Adressrad 2"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Street Address"
+msgstr "Gatuadress"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Link address to Google Maps"
+msgstr "Länkadress till Google Maps"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Lets you add an email address, phone number, and physical address with improved markup for better SEO results."
+msgstr "Låter dig lägga till en e-postadress, telefonnummer och fysisk adress med förbättrad kod för bättre sökmotorsoptimeringsresultat."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Postal/Zip Code"
+msgstr "Postnummer"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "State/Province/Region"
+msgstr "Stat/Landskap/Region"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Lets you add a physical address with Schema markup."
+msgstr "Låter dig lägga till en fysisk adress med Schema-kod."
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "image %1$d of %2$d in gallery"
+msgstr "bild %1$d av %2$d i galleriet"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Customize your message"
+msgstr "Anpassa ditt meddelande"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Share this post"
+msgstr "Dela detta inlägg"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "%d character remaining"
+msgid_plural "%d characters remaining"
+msgstr[0] "%d tecken återstår"
+msgstr[1] "%d tecken återstår"
+
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Lets you add an email address with an automatically generated click-to-email link."
+msgstr "Låter dig lägga till en e-postadress med en automatiskt genererad e-postlänk."
+
+#: jetpack.php:74
+msgid "Jetpack requires a more recent version of WordPress and has been paused. Please update WordPress to continue enjoying Jetpack."
+msgstr "Jetpack kräver en senare version av WordPress och har pausats. Uppdatera wordPress för att fortsätta att använda Jetpack."
+
+#: extensions/blocks/mailchimp/mailchimp.php:43 _inc/blocks/editor-beta.js:24
+#: _inc/blocks/editor.js:24
+msgid "Whoops! There was an error and we couldn't process your subscription. Please reload the page and try again."
+msgstr "Oj då! Det uppstod ett fel och vi kunde inte behandla din prenumeration. Vänligen ladda om sidan och försök igen."
+
+#: extensions/blocks/mailchimp/mailchimp.php:42 _inc/blocks/editor-beta.js:24
+#: _inc/blocks/editor.js:24
+msgid "Success! You're on the list."
+msgstr "Klart! Du är med på listan."
+
+#: extensions/blocks/mailchimp/mailchimp.php:41 _inc/blocks/editor-beta.js:24
+#: _inc/blocks/editor.js:24
+msgid "Processing…"
+msgstr "Bearbetar…"
+
+#: extensions/blocks/business-hours/business-hours.php:131
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Closed"
+msgstr "Stängd"
+
+#: _inc/blocks/editor-beta.js:12 _inc/blocks/editor-beta.js:24
+#: _inc/blocks/map/view.js:1 _inc/blocks/editor.js:12 _inc/blocks/editor.js:24
+msgid "Map"
+msgstr "Karta"
+
+#: extensions/blocks/mailchimp/mailchimp.php:40 _inc/blocks/editor-beta.js:24
+#: _inc/blocks/editor.js:24
+msgid "By clicking submit, you agree to share your email address with the site owner and Mailchimp to receive marketing, updates, and other emails from the site owner. Use the unsubscribe link in those emails to opt out at any time."
+msgstr "Genom att klicka på skicka in så går du med på att dela din e-postadress med webbplatsens ägare och Mailchimp för att ta emot marknadsföring, uppdateringar och andra e-postmeddelanden från webbplatsens ägare. Du kan när som helst använda länken i e-postmeddelandena för att säga upp prenumerationen."
+
+#: json-endpoints/jetpack/class.jetpack-json-api-get-database-object-backup-endpoint.php:75
+msgid "Object not found"
+msgstr "Objektet kunde inte hittas"
+
+#: json-endpoints/jetpack/class.jetpack-json-api-get-database-object-backup-endpoint.php:55
+msgid "Specified object_type not recognized"
+msgstr "Specificerad object_type inte igenkänd"
+
+#: json-endpoints/jetpack/class.jetpack-json-api-get-database-object-backup-endpoint.php:51
+msgid "You must specify both an object type and id to fetch"
+msgstr "Du måste specificera både en objekttyp och ett id för att hämta"
+
+#: json-endpoints/jetpack/class.jetpack-json-api-jps-woocommerce-connect-endpoint.php:53
+msgid "site_id is required"
+msgstr "site_id krävs"
+
+#: json-endpoints/jetpack/class.jetpack-json-api-jps-woocommerce-connect-endpoint.php:45
+msgid "access_token_secret is required"
+msgstr "access_token_secret krävs"
+
+#: json-endpoints/jetpack/class.jetpack-json-api-jps-woocommerce-connect-endpoint.php:41
+msgid "access_token is required"
+msgstr "access_token krävs"
+
+#: json-endpoints/jetpack/class.jetpack-json-api-jps-woocommerce-connect-endpoint.php:14
+msgid "WooCommerce auth data is already set."
+msgstr "WooCommerce-autentiseringsdata är redan inställd."
+
+#. translators: the placeholder is a URL
+#: class.jetpack-cli.php:1966
+msgid "Read more at %s"
+msgstr "Läs mer på %s"
+
+#: class.jetpack-cli.php:1964
+msgid "To load the block, add the constant JETPACK_BETA_BLOCKS as true to your wp-config.php file"
+msgstr "För att ladda blocket, lägg till konstanten JETPACK_BETA_BLOCKS som sann för din wp-config.php-fil"
+
+#. translators: the placeholder is a file path
+#: class.jetpack-cli.php:1963
+msgid "The block slug has been added to the beta list at %s"
+msgstr "Blocksluggen har lagts till i betalistan på %s"
+
+#: class.jetpack-cli.php:1961
+msgid "To start using the block, build the blocks with yarn run build-extensions"
+msgstr "För att börja använda blocket, bygg blocken med \"yarn run build\"-tillägg"
+
+#. translators: the placeholder is a directory path
+#: class.jetpack-cli.php:1960
+msgid "The files were created at %s"
+msgstr "Filerna skapades på %s"
+
+#. translators: %s is the path to the file with the block list
+#: class.jetpack-cli.php:1950
+msgid "Error writing new %s"
+msgstr "Det gick inte att skriva nytt %s"
+
+#. translators: %s is the path to the file with the block list
+#: class.jetpack-cli.php:1944
+msgid "Error fetching contents of %s"
+msgstr "Det gick inte att hämta innehåll i %s"
+
+#: class.jetpack-cli.php:1937
+msgid "No files were created"
+msgstr "Inga filer skapades"
+
+#. translators: %s is a file name
+#: class.jetpack-cli.php:1932
+msgid "Error creating %s"
+msgstr "Det gick inte att skapa %s"
+
+#. translators: %s is path to the conflicting block
+#: class.jetpack-cli.php:1871
+msgid "Name conflicts with the existing block %s"
+msgstr "Namnet står i konflikt med det befintliga blocket %s"
+
+#: class.jetpack-cli.php:1864
+msgid "Can't write files"
+msgstr "Det går inte att skriva filer"
+
+#: class.jetpack-cli.php:1859
+msgid "Invalid block slug. They can contain only lowercase alphanumeric characters or dashes, and start with a letter"
+msgstr "Ogiltig blockslugg. De får endast innehålla gemena alfanumeriska tecken eller bindestreck, och måste börja med en bokstav"
+
+#: class.jetpack-cli.php:1846
+msgid "The title parameter is required."
+msgstr "Titelparametern är nödvändig."
+
+#. translators: %s is the subcommand
+#: class.jetpack-cli.php:1831
+msgid "Invalid subcommand %s."
+msgstr "Ogiltigt underkommando %s."
+
+#: extensions/blocks/mailchimp/mailchimp.php:38 _inc/blocks/editor-beta.js:24
+#: _inc/blocks/editor.js:24
+msgid "Enter your email"
+msgstr "Ange din e-postadress"
+
+#: extensions/blocks/mailchimp/mailchimp.php:39 _inc/blocks/editor-beta.js:24
+#: _inc/blocks/editor.js:24
+msgid "Join my email list"
+msgstr "Gå med i min e-postlista"
+
+#: class.jetpack-cli.php:1624
+msgid "The publicize module is not loaded."
+msgstr "Publiceringsmodulen är inte laddad."
+
+#: class.jetpack-cli.php:1620
+msgid "Jetpack is currently in development mode, so the publicize module will not load."
+msgstr "JetPack är för närvarande i utevklingsläge, så publiceringsmodulen kommer inte att laddas."
+
+#: class.jetpack-cli.php:1617
+msgid "Jetpack is current in development mode because the site url does not contain a '.', which often occurs when dynamically setting the WP_SITEURL constant. While in development mode, the publicize module will not load."
+msgstr "JetPack är för närvarande i utvecklingsläge eftersom webbplatsen URL inte innehåller en ’.’, vilket ofta sker vid dynamisk inställning av WP_SITEURL-konstanten. Publiceringsmodulen laddas inte i utvecklingsläget."
+
+#. translators: the placeholders are a human readable title, and a series of
+#. words separated by dashes
+#: class.jetpack-cli.php:1957
+msgid "Successfully created block %1$s with slug %2$s"
+msgstr "Skapade block %1$s med slug %2$s utan problem"
+
+#: class.jetpack-cli.php:1445
+msgid "Both `pass` and `kpri` fields cannot be blank."
+msgstr "Fälten `pass` och `kpri` får inte lämnas tomma."
+
+#. translators: %s is a slug, such as 'host'.
+#: class.jetpack-cli.php:1437
+msgid "`%s` cannot be empty."
+msgstr "`%s` får inte vara tomt."
+
+#: class.jetpack-cli.php:910
+msgid "Jetpack sync is not currently allowed for this site. The site is in staging mode."
+msgstr "Jetpack-synkronisering är för närvarande inte tillåtet för denna webbplats. Webbplatsen är i mellanlagringsläge."
+
+#: class.jetpack-cli.php:1608
+msgid "The publicize module is not active."
+msgstr "Publiceringsmodulen är inte aktiv."
+
+#: class.jetpack-cli.php:906
+msgid "Jetpack sync is not currently allowed for this site. The site is in development mode."
+msgstr "Jetpack-synkronisering är för närvarande inte tillåtet för denna webbplats. Webbplatsen är i utvecklingsläge."
+
+#: class.jetpack-cli.php:902
+msgid "Jetpack sync is not currently allowed for this site. Jetpack is not connected."
+msgstr "Jetpack-synkronisering är för närvarande inte tillåtet för denna webbplats. Jetpack är inte anslutet."
+
+#: class.jetpack-cli.php:898
+msgid "Jetpack sync is not currently allowed for this site. It is currently disabled. Run `wp jetpack sync enable` to enable it."
+msgstr "Jetpack-synkronisering är för närvarande inte tillåtet för denna webbplats. Det är för närvarande inaktiverat. Kör `wp jetpack sync enable` för att aktivera det."
+
+#: class.jetpack-cli.php:889
+msgid "Please specify what type of queue do you want to reset: `full` or `regular`."
+msgstr "Ange vilken typ av kö som du vill återställa: `full` eller `regular`."
+
+#. translators: %s is the site URL
+#: class.jetpack-cli.php:886
+msgid "Reset Full Sync Queue on %s"
+msgstr "Återställ fullständig synkroniseringskö på %s"
+
+#. translators: %s is the site URL
+#: class.jetpack-cli.php:881
+msgid "Reset Regular Sync Queue on %s"
+msgstr "Återställ vanlig synkroniseringskö på %s"
+
+#. translators: %s is the site URL
+#: class.jetpack-cli.php:872
+msgid "Reset Full Sync and Regular Queues Queue on %s"
+msgstr "Återställ fullständig och vanlig synkroniseringskö på %s"
+
+#. translators: %s is the site URL
+#: class.jetpack-cli.php:866
+msgid "Sync Disabled on %s. Use `wp jetpack sync enable` to enable syncing again."
+msgstr "Synkronisering inaktiverad på %s. Använd `wp jetpack sync enable` för att aktivera synkronisering igen."
+
+#. translators: %s is the site URL
+#: class.jetpack-cli.php:859
+msgid "Sync Enabled on %s"
+msgstr "Synkronisering aktiverad på %s"
+
+#. translators: %s is the site URL
+#: class.jetpack-cli.php:854
+msgid "Sync Disabled on %s"
+msgstr "Synkronisering inaktiverad på %s"
+
+#: class.jetpack-cli.php:841
+msgid "Sync Settings:"
+msgstr "Synkroniseringsinställningar:"
+
+#: class.jetpack-cli.php:837
+msgid "Sync Status:"
+msgstr "Synkroniseringsstatus:"
+
+#: _inc/lib/class.jetpack-password-checker.php:264
+msgid "Your password is too weak: Looks like you're including easy to guess information about yourself. Try something a little more unique."
+msgstr "Ditt lösenord är för svagt: Det ser ut som att du inkluderar information om dig som är lätt att gissa. Försök med något mer unikt."
+
+#: _inc/lib/class.jetpack-password-checker.php:258
+msgid "This is a very common password. Choose something that will be harder for others to guess."
+msgstr "Detta är ett mycket vanligt lösenord. Välj något som är svårare för andra att gissa sig till."
+
+#: _inc/lib/class.jetpack-password-checker.php:250
+msgid "This password is too easy to guess: you can improve it by including special characters such as !#=?*&."
+msgstr "Det här lösenordet är för enkelt att gissa: du kan förbättra det genom att lägga till specialtecken, t.ex. !#=?*&."
+
+#: _inc/lib/class.jetpack-password-checker.php:244
+msgid "This password is too easy to guess: you can improve it by mixing both letters and numbers."
+msgstr "Det här lösenordet är för enkelt att gissa: du kan förbättra det genom att använda både bokstäver och siffror."
+
+#: _inc/lib/class.jetpack-password-checker.php:238
+msgid "This password is too easy to guess: you can improve it by adding additional uppercase letters, lowercase letters, or numbers."
+msgstr "Det här lösenordet är för enkelt att gissa: du kan förbättra det genom att lägga till fler versaler, gemener, eller siffror."
+
+#: _inc/lib/debugger/debug-functions-for-php53.php:35
+msgid "Jetpack: "
+msgstr "Jetpack: "
+
+#: _inc/lib/debugger/debug-functions-for-php53.php:86
+msgid "Jetpack Tests"
+msgstr "Jetpack-tester"
+
+#: _inc/lib/debugger/debug-functions-for-php53.php:55
+msgid "This test successfully passed!"
+msgstr "Detta test lyckades!"
+
+#. translators: %1$s is URL to jetpack.com's contact support page. %2$s
+#. accessibility text
+#: _inc/lib/debugger/class-jetpack-debug-data.php:106
+msgid "Diagnostic information helpful to your Jetpack Happiness team%2$s"
+msgstr "Diagnostisk information som är till hjälp för ditt Jetpack-supportteam%2$s"
+
+#. translators: URL for Jetpack support. URL for WordPress's Site Health
+#: _inc/lib/debugger/class-jetpack-debugger.php:238
+msgid "Contact our Happiness team. When you do, please include the full debug information from your site."
+msgstr "Kontakta vårt supportteam. När du gör detta, inkludera hela felsökningsinformationen från din webbplats."
+
+#. translators: %d is a number of characters in the password.
+#: _inc/lib/class.jetpack-password-checker.php:232
+msgid "Password must be at least %d characters."
+msgstr "Lösenordet måste vara minst %d tecken långt."
+
+#: _inc/lib/class.jetpack-password-checker.php:225
+msgid "Passwords may not contain the character \"\\\"."
+msgstr "Lösenord kan inte innehålla tecknet \"\\\"."
+
+#: _inc/lib/class.jetpack-photon-image.php:214
+msgid "Could not calculate resized image dimensions"
+msgstr "Kunde inte beräkna dimensioner för den omskalade bilden"
+
+#: _inc/lib/debugger/class-jetpack-debugger.php:227
+msgid "Ask us for help!"
+msgstr "Fråga oss om hjälp!"
+
+#: _inc/lib/debugger/class-jetpack-debugger.php:226
+msgid "Still having trouble?"
+msgstr "Har du fortfarande problem?"
+
+#: _inc/lib/debugger/class-jetpack-debugger.php:314
+msgid "Advanced Debug Results"
+msgstr "Avancerade felsökningsresultat"
+
+#. translators: URL for Jetpack support.
+#: _inc/lib/debugger/class-jetpack-debugger.php:249
+msgid "Contact our Happiness team. When you do, please include the full debug information below."
+msgstr "Kontakta vårt supportteam. När du gör detta, inkludera hela felsökningsinformationen nedan."
+
+#: _inc/lib/debugger/class-jetpack-debug-data.php:379
+msgid "Master user no longer exists. Please disconnect and reconnect Jetpack."
+msgstr "Huvudanvändaren finns inte längre. Koppla ifrån och koppla tillbaka Jetpack."
+
+#: _inc/lib/debugger/class-jetpack-debug-data.php:373
+msgid "No master user set."
+msgstr "Ingen huvudanvändare angiven"
+
+#: _inc/lib/debugger/class-jetpack-cxn-test-base.php:395
+msgid "There was another problem:"
+msgstr "Det var ett annat problem:"
+
+#: _inc/lib/debugger/debug-functions-for-php53.php:74
+#: _inc/lib/debugger/class-jetpack-cxn-test-base.php:387
+msgid "Resolve"
+msgstr "Lös"
+
+#: _inc/lib/debugger/class-jetpack-cxn-test-base.php:362
+msgid "Jetpack's async local testing suite passed all tests!"
+msgstr "Jetpacks asynkrona lokala testningssvit klarade alla tester!"
+
+#: _inc/lib/debugger/class-jetpack-cxn-test-base.php:354
+msgid "Jetpack passed all async tests."
+msgstr "Jetpack klarade alla asynkrona tester."
+
+#: _inc/lib/debugger/class-jetpack-cxn-test-base.php:297
+msgid "Please contact Jetpack support."
+msgstr "Kontakta Jetpack-supporten."
+
+#: _inc/lib/debugger/class-jetpack-cxn-test-base.php:134
+msgid "There is no test by that name: "
+msgstr "Det finns inget test med det namnet: "
+
+#: _inc/lib/debugger/class-jetpack-cxn-test-base.php:73
+msgid "Tests must be valid PHP callables."
+msgstr "Tester måste vara filtiga PHP-anrop."
+
+#: _inc/lib/debugger/class-jetpack-cxn-test-base.php:70
+msgid "Test names must be unique."
+msgstr "Testnamn måste vara unika."
+
+#: _inc/lib/debugger/class-jetpack-cxn-test-base.php:67
+msgid "add_test arguments changed in 7.3.0. Please reference inline documentation."
+msgstr "Argument för add_test ändrades i 7.3.0. Se infogad dokumentation."
+
+#. translators: accessibility text
+#: jetpack.php:124 _inc/lib/debugger/debug-functions-for-php53.php:76
+#: _inc/lib/debugger/class-jetpack-debug-data.php:111
+#: _inc/lib/debugger/class-jetpack-cxn-test-base.php:389
+msgid "(opens in a new tab)"
+msgstr "(öppnas i en ny flik)"
+
+#: _inc/lib/admin-pages/class.jetpack-admin-page.php:439
+msgctxt "Navigation item"
+msgid "Modules"
+msgstr "Moduler"
+
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:312
+msgid "Try adding the following to your wp-config.php file:"
+msgstr "Försök lägga till följande i din wp-config.php-fil:"
+
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:311
+msgid "The server port value is unexpected."
+msgstr "Serverportens värde är oväntat."
+
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:184
+msgid "Your server did not successfully connect to the Jetpack server using HTTPS"
+msgstr "Din server lyckades inte ansluta till Jetpack-servern med hjälp av HTTPS"
+
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:165
+msgid "Your server did not successfully connect to the Jetpack server using HTTP"
+msgstr "Din server lyckades inte ansluta till Jetpack-servern med hjälp av HTTP"
+
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:146
+msgid "Please ask your hosting provider to refer to our server requirements at https://jetpack.com/support/server-requirements/ and enable PHP's XML module."
+msgstr "Be ditt webbhotell att hänvisa dig till våra serverkrav på https://jetpack.com/support/server-requirements/ och aktivera PHP:s XML-modul."
+
+#: _inc/lib/debugger/class-jetpack-cxn-test-base.php:326
+msgid "TEST RESULTS:"
+msgstr "TESTRESULTAT:"
+
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:83
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:120
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:198
+msgid "Jetpack is not connected."
+msgstr "Jetpack är inte ansluten."
+
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:81
+msgid "Disable development mode."
+msgstr "Inaktivera utvecklingsläge."
+
+#: _inc/lib/debugger/class-jetpack-cxn-test-base.php:323
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:81
+msgid "Jetpack is in Development Mode:"
+msgstr "Jetpack är i utvecklingsläge:"
+
+#. translators: a WordPress username
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:128
+msgid "The user (%s) who setup the Jetpack connection is not an administrator."
+msgstr "Användaren (%s) som ställer in Jetpack-anslutningen är inte en administratör."
+
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:104
+msgid "The user who setup the Jetpack connection no longer exists on this site."
+msgstr "Användaren som ställer in Jetpack-anslutningen finns inte längre på denna webbplats."
+
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:146
+msgid "PHP XML manipluation libraries are not available."
+msgstr "Bibliotek för PHP XML-manipulation är inte tillgängliga."
+
+#. translators: a WordPress username
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:128
+msgid "Either upgrade the user or disconnect and reconnect Jetpack."
+msgstr "Uppgradera användaren eller koppla ifrån och koppla tillbaka Jetpack igen."
+
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:97
+msgid "Jetpack is not connected. No master user to check."
+msgstr "Jetpack är inte anslutet. Ingen huvudanvändare att kontrollera."
+
+#: _inc/lib/debugger/class-jetpack-cxn-test-base.php:293
+msgid "Please ask your hosting provider to confirm your server can make outbound requests to jetpack.com."
+msgstr "Be din webbleverantör för att bekräfta att din server kan göra utgående begäranden till jetpack.com."
+
+#: _inc/lib/debugger/class-jetpack-cxn-test-base.php:290
+msgid "Please disconnect and reconnect Jetpack."
+msgstr "Koppla ifrån och koppla tillbaka Jetpack."
+
+#: _inc/lib/debugger/class-jetpack-cxn-test-base.php:248
+msgid "Test Passed!"
+msgstr "Testet godkänt!"
+
+#. translators: %1$s is the error code, %2$s is the error message
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:237
+msgid "Connection test failed (#%1$s: %2$s)"
+msgstr "Anslutningstest misslyckades (#%1$s: %2$s)"
+
+#: _inc/lib/debugger/class-jetpack-cxn-tests.php:243
+msgid "Connection test failed (empty response body)"
+msgstr "Anslutningstest misslyckades (tom svarstext)"
+
+#: _inc/lib/admin-pages/class.jetpack-admin-page.php:292
+msgctxt "Navigation item"
+msgid "Sites"
+msgstr "Webbplatser"
+
+#: _inc/lib/admin-pages/class.jetpack-admin-page.php:419
+msgctxt "Navigation item"
+msgid "Network Sites"
+msgstr "Nätverksplatser"
+
+#: _inc/lib/admin-pages/class.jetpack-admin-page.php:296
+#: _inc/lib/admin-pages/class.jetpack-admin-page.php:429
+msgctxt "Navigation item"
+msgid "Network Settings"
+msgstr "Nätverksinställningar"
+
+#: _inc/lib/admin-pages/class.jetpack-admin-page.php:292
+#: _inc/lib/admin-pages/class.jetpack-admin-page.php:296
+msgid "Manage your network's Jetpack Sites."
+msgstr "Hantera ditt nätverks Jetpack-webbplatser."
+
+#. translators: number of active installs
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:501
+msgid "%s Active Installations"
+msgstr "%s aktiva installationer"
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:496
+msgctxt "Active plugin installations"
+msgid "Less Than 10"
+msgstr "Färre än 10"
+
+#. translators: number of millions of installs.
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:492
+msgctxt "Active plugin installations"
+msgid "%s+ Million"
+msgid_plural "%s+ Million"
+msgstr[0] "%s+ miljoner"
+msgstr[1] "%s+ miljoner"
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:485
+msgid "ratings"
+msgstr "betyg"
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:470
+msgid "More Details"
+msgstr "Mer detaljer"
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:442
+msgid "This plugin doesn’t work with your version of PHP."
+msgstr "Detta tillägg fungerar inte med din PHP-version."
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:433
+msgid "This plugin doesn’t work with your version of WordPress."
+msgstr "Detta tillägg fungerar inte med din WordPress-version."
+
+#. translators: %s: "Update PHP" page URL
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:427
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:446
+msgid "Learn more about updating PHP."
+msgstr "Läs mer om uppdatering av PHP."
+
+#. translators: %s: "Update WordPress" screen URL
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:421
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:437
+msgid "Please update WordPress."
+msgstr "Uppdatera WordPress."
+
+#. translators: 1: "Update WordPress" screen URL, 2: "Update PHP" page URL
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:413
+msgid "Please update WordPress, and then learn more about updating PHP."
+msgstr "Uppdatera WordPress, och läs sedan mer om uppdatering av PHP."
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:409
+msgid "This plugin doesn’t work with your versions of WordPress and PHP."
+msgstr "Detta tillägg fungerar inte med din WordPress- och PHP-version."
+
+#. translators: %s: plugin name
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:354
+msgctxt "plugin"
+msgid "Activate %s"
+msgstr "Aktivera %s"
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:349
+msgctxt "plugin"
+msgid "Active"
+msgstr "Aktiv"
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:339
+msgid "Update Now"
+msgstr "Uppdatera nu"
+
+#. translators: %s: plugin name and version
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:337
+msgid "Update %s now"
+msgstr "Uppdatera %s nu"
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:318
+msgid "Install Now"
+msgstr "Installera nu"
+
+#. translators: %s: plugin name and version
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:316
+msgid "Install %s now"
+msgstr "Installera %s nu"
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:323
+msgctxt "plugin"
+msgid "Cannot Install"
+msgstr "Kan inte installera"
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:381
+msgctxt "plugin"
+msgid "Installed"
+msgstr "Installerat"
+
+#. translators: %s: plugin name
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:367
+msgctxt "plugin"
+msgid "Network Activate %s"
+msgstr "Aktivera för nätverk %s"
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:365
+msgid "Network Activate"
+msgstr "Aktivera för nätverk"
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:198
+msgid "For even more of our WordPress plugins, please take a look at our WordPress.org profile."
+msgstr "För fler av våra WordPress-tillägg, ta en titt på vår WordPress.org-profil."
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:182
+msgid "Come work with us"
+msgstr "Kom och arbeta med oss"
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:190
+msgid "Popular WordPress services by Automattic"
+msgstr "Populära WordPress-tjänster från Automattic"
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:167
+msgid "We strive to live by the Automattic Creed."
+msgstr "Vi strävar efter att följa Automattic-tankesättet."
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:161
+msgid "We believe in Open Source and the vast majority of our work is available under the GPL."
+msgstr "Vi tror på Open Source och huvuddelen av vårt arbete finns tillgängligt under GPL."
+
+#. translators: first placeholder is the number of Automattic employees. The
+#. second is the number of countries of origin
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:152
+msgid "We’re a distributed company with over %1$s Automatticians in more than %2$s countries speaking at least %3$s different languages. Our common goal is to democratize publishing so that anyone with a story can tell it, regardless of income, gender, politics, language, or where they live in the world."
+msgstr "Vi är ett distribuerat företag med över %1$s Automattic-anställda i över %2$s länder som talar minst %3$s olika språk. Vårt gemensamma mål är att demokratisera publicering så att alla med en historia kan berätta den, oavsett inkomst, kön, politik, språk eller var de bor i världen."
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:144
+msgid "Learn more about us."
+msgstr "Lär dig mer om oss"
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:142
+msgid "We are the people behind WordPress.com, WooCommerce, Jetpack, Simplenote, Longreads, VaultPress, Akismet, Gravatar, Crowdsignal, Cloudup, and more. We believe in making the web a better place."
+msgstr "Vi är människorna bakom WordPress.com, WooCommerce, Jetpack, Simplenote, Longreads, VaultPress, Akismet, Gravatar, Crowdsignal, Cloudup, med mera. Vi tror på att göra webben till en bättre plats."
+
+#: _inc/lib/class.core-rest-api-endpoints.php:1118
+msgid "Could not retrieve Backup & Scan data."
+msgstr "Det gick inte att hämta data för Säkerhetskopiera & Skanna."
+
+#: _inc/lib/class.core-rest-api-endpoints.php:1102
+msgid "Backup & Scan data correctly received."
+msgstr "Data för Säkerhetskopiera & Skanna mottogs."
+
+#: _inc/lib/core-api/wpcom-endpoints/memberships.php:130
+#: _inc/lib/core-api/wpcom-endpoints/memberships.php:165
+msgid "Could not connect to WordPress.com"
+msgstr "Det gick inte att ansluta till WordPress.com"
+
+#: _inc/lib/core-api/wpcom-endpoints/memberships.php:128
+#: _inc/lib/core-api/wpcom-endpoints/memberships.php:163
+msgid "Please connect your user account to WordPress.com"
+msgstr "Anslut ditt användarkonto till WordPress.com"
+
+#: _inc/lib/core-api/wpcom-endpoints/memberships.php:95
+msgid "Please set up a Stripe account for this site first"
+msgstr "Skapa ett Stripe-konto för den här webbplatsen först"
+
+#: _inc/lib/admin-pages/class.jetpack-admin-page.php:393
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:45
+msgid "About Jetpack"
+msgstr "Om Jetpack"
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:136
+msgid "Meet the Automattic team"
+msgstr "Möt Automattic-teamet"
+
+#: _inc/lib/admin-pages/class-jetpack-about-page.php:98
+msgid "Back to Jetpack Dashboard"
+msgstr "Tillbaka till Jetpack-instrumentpanelen"
+
+#: _inc/lib/core-api/wpcom-endpoints/class-wpcom-rest-api-v2-endpoint-mailchimp.php:66
+msgid "Sorry, something is wrong with your Jetpack connection."
+msgstr "Tyvärr, något är fel med din Jetpack-anslutning."
+
+#: _inc/lib/core-api/wpcom-fields/attachment-fields-videopress.php:53
+msgid "Unique VideoPress ID"
+msgstr "Unikt VideoPress-ID"
+
+#: _inc/lib/class.core-rest-api-endpoints.php:958
+#: _inc/lib/class.core-rest-api-endpoints.php:1022
+msgid "All connection tests passed."
+msgstr "Alla anslutningstester godkända."
+
+#: _inc/lib/core-api/wpcom-endpoints/service-api-keys.php:93
+msgid "User friendly message"
+msgstr "Användarvänligt meddelande"
+
+#: _inc/lib/core-api/wpcom-endpoints/service-api-keys.php:85
+msgid "The name of the service in question"
+msgstr "Namnet på den aktuella tjänsten"
+
+#: _inc/lib/core-api/wpcom-endpoints/service-api-keys.php:89
+msgid "The API key used by the service. Empty if none has been set yet"
+msgstr "API-nyckeln som används av tjänsten. Lämna tomt om den inte är inställd ännu"
+
+#: _inc/lib/core-api/wpcom-endpoints/service-api-keys.php:81
+msgid "Displays success if the operation was successfully executed and an error code if it was not"
+msgstr "Bekräftar lyckat genomförande om åtgärden har genomförts och en felkod om den inte lyckades"
+
+#: _inc/lib/core-api/wpcom-fields/post-fields-publicize-connections.php:133
+msgid "Sorry, you are not allowed to access Publicize data for this post."
+msgstr "Du saknar behörighet för att få åtkomst till publiceringsdata på det här inlägget."
+
+#: _inc/lib/core-api/wpcom-fields/post-fields-publicize-connections.php:103
+msgid "Whether `enable` can be changed for this post/connection"
+msgstr "Huruvida ”aktivera” kan ändras för detta inlägg/denna anslutning"
+
+#: _inc/lib/core-api/wpcom-fields/post-fields-publicize-connections.php:97
+msgid "Whether Publicize has already finished sharing for this post"
+msgstr "Huruvida publiceringsverktyget redan har delat inlägget"
+
+#: _inc/lib/core-api/wpcom-fields/post-fields-publicize-connections.php:92
+msgid "Whether to share to this connection"
+msgstr "Huruvida anslutningen ska delas"
+
+#: _inc/lib/core-api/wpcom-endpoints/publicize-services.php:69
+msgid "The URL used to connect to the Publicize Service"
+msgstr "Den webbadress som används för att ansluta till publiceringstjänsten"
+
+#: _inc/lib/core-api/wpcom-endpoints/service-api-keys.php:176
+msgid "API key deleted successfully."
+msgstr "API-nyckeln togs bort utan problem."
+
+#: _inc/lib/core-api/wpcom-endpoints/service-api-keys.php:150
+msgid "API key updated successfully."
+msgstr "API-nyckeln uppdaterades utan problem."
+
+#: _inc/lib/core-api/wpcom-endpoints/service-api-keys.php:148
+msgid "Invalid API Key"
+msgstr "Ogiltig API-nyckel"
+
+#: _inc/lib/core-api/wpcom-endpoints/service-api-keys.php:118
+msgid "API key retrieved successfully."
+msgstr "API-nyckeln hämtades utan problem."
+
+#: _inc/lib/core-api/wpcom-endpoints/publicize-connection-test-results.php:66
+msgid "URL for refreshing the Connection to the Publicize Service"
+msgstr "Webbadress för att förnya anslutningen till publiceringstjänsten"
+
+#: _inc/lib/core-api/wpcom-endpoints/publicize-connection-test-results.php:62
+msgid "Message instructing the user to refresh their Connection to the Publicize Service"
+msgstr "Meddelande som uppmanar användaren att förnya sin anslutning till publiceringstjänsten"
+
+#: _inc/lib/core-api/wpcom-endpoints/publicize-connection-test-results.php:58
+msgid "Can the current user refresh the Publicize Connection?"
+msgstr "Kan den aktuella användaren förnya publiceringsanslutningen?"
+
+#: _inc/lib/core-api/wpcom-endpoints/publicize-connection-test-results.php:54
+msgid "Publicize Connection success or error message"
+msgstr "Meddelande om lyckad eller misslyckad publiceringsanslutning"
+
+#: _inc/lib/core-api/wpcom-endpoints/publicize-connection-test-results.php:50
+msgid "Did the Publicize Connection test pass?"
+msgstr "Lyckades testet för publiceringsanslutningen?"
+
+#: _inc/lib/core-api/wpcom-endpoints/service-api-keys.php:245
+msgid "Can't connect to Mapbox"
+msgstr "Det går inte att ansluta till Mapbox"
+
+#: _inc/lib/core-api/wpcom-endpoints/service-api-keys.php:207
+msgid "Invalid Service"
+msgstr "Ogiltig tjänst"
+
+#. translators: %s: get_permission_check()
+#. translators: %s: get()
+#. translators: %s: update_permission_check()
+#. translators: %s: update()
+#. translators: %s: get_schema()
+#: _inc/lib/core-api/class-wpcom-rest-field-controller.php:178
+#: _inc/lib/core-api/class-wpcom-rest-field-controller.php:190
+#: _inc/lib/core-api/class-wpcom-rest-field-controller.php:203
+#: _inc/lib/core-api/class-wpcom-rest-field-controller.php:216
+#: _inc/lib/core-api/class-wpcom-rest-field-controller.php:246
+msgid "Method '%s' must be overridden."
+msgstr "Metoden \"%s” måste åsidosättas."
+
+#. translators: %s: the name of an API response field
+#: _inc/lib/core-api/class-wpcom-rest-field-controller.php:155
+msgid "You are not allowed to access the '%s' field."
+msgstr "Du har inte åtkomstbehörighet till fältet \"%s\"."
+
+#. translators: %s: get_permission_check()
+#. translators: %s: update_permission_check()
+#: _inc/lib/core-api/class-wpcom-rest-field-controller.php:123
+#: _inc/lib/core-api/class-wpcom-rest-field-controller.php:153
+msgid "Method '%s' must return either true or WP_Error."
+msgstr "Metoden '%s' måste returnera antingen true eller WP_Error."
+
+#. translators: %s: object_type
+#. translators: %s: field_name
+#: _inc/lib/core-api/class-wpcom-rest-field-controller.php:23
+#: _inc/lib/core-api/class-wpcom-rest-field-controller.php:29
+msgid "Property '%s' must be overridden."
+msgstr "Egenskapen \"%s\" måste åsidosättas."
+
+#: _inc/lib/class.core-rest-api-endpoints.php:612
+msgid "Site is under construction and cannot be verified"
+msgstr "Webbplatsen är under uppbyggnad och kan inte verifieras"
+
+#: _inc/lib/core-api/wpcom-endpoints/memberships.php:108
+msgid "Creating product has failed."
+msgstr "Skapa produkt har misslyckats."
+
+#: _inc/lib/core-api/wpcom-endpoints/gutenberg-available-extensions.php:52
+msgid "Reason for the extension not being available"
+msgstr "Anledning för tillägget finns inte tillgängligt"
+
+#: _inc/lib/core-api/wpcom-endpoints/gutenberg-available-extensions.php:48
+msgid "Whether the extension is available"
+msgstr "Ifall tillägget finns tillgängligt"
+
+#: _inc/lib/core-api/wpcom-endpoints/publicize-services.php:65
+msgid "Human readable label for the Publicize Service"
+msgstr "Etikett som kan läsas av människor för publiceringstjänsten"
+
+#: _inc/lib/core-api/wpcom-endpoints/publicize-connections.php:74
+msgid "Is this connection available to all users?"
+msgstr "Är denna anslutning tillgänglig för alla användare?"
+
+#: _inc/lib/core-api/wpcom-fields/post-fields-publicize-connections.php:86
+#: _inc/lib/core-api/wpcom-endpoints/publicize-connections.php:70
+msgid "Username of the connected account"
+msgstr "Användarnamn på det anslutna kontot"
+
+#: _inc/lib/core-api/wpcom-endpoints/publicize-connections.php:188
+#: _inc/lib/core-api/wpcom-endpoints/publicize-services.php:161
+msgid "Sorry, you are not allowed to access Publicize data on this site."
+msgstr "Du saknar behörighet för att få åtkomst till publiceringsdata på den här webbplatsen."
+
+#: _inc/lib/core-api/wpcom-fields/post-fields-publicize-connections.php:80
+#: _inc/lib/core-api/wpcom-endpoints/publicize-connections.php:66
+#: _inc/lib/core-api/wpcom-endpoints/publicize-services.php:61
+msgid "Alphanumeric identifier for the Publicize Service"
+msgstr "Alfanumeriskt ID för publiceringstjänsten"
+
+#: _inc/lib/core-api/wpcom-fields/post-fields-publicize-connections.php:74
+#: _inc/lib/core-api/wpcom-endpoints/publicize-connections.php:62
+msgid "Unique identifier for the Publicize Connection"
+msgstr "Unikt ID för publiceringsanslutningen"
+
+#: _inc/jetpack-strings.php:719
+msgid "Manually Verify "
+msgstr "Verifiera manuellt"
+
+#: _inc/jetpack-strings.php:717
+msgid "Verify with Google"
+msgstr "Verifiera med Google"
+
+#: _inc/jetpack-strings.php:715
+msgid "Google will email about certain events that occur with your site, including indications that your website has been {{a1}}hacked{{/a1}}, or problems {{a2}}crawling or indexing{{/a2}} your site."
+msgstr "Google kommer att skicka e-post om vissa händelser på din webbplats, inklusive indikationer på att din webbplats har blivit {{a1}}hackad{{/a1}}, eller problem med {{a2}}indexeringen av{{/a2}} din webbplats."
+
+#: _inc/jetpack-strings.php:718
+msgid "or"
+msgstr "eller"
+
+#: _inc/lib/core-api/wpcom-fields/post-fields-publicize-connections.php:122
+#: _inc/lib/core-api/wpcom-endpoints/publicize-connections.php:177
+#: _inc/lib/core-api/wpcom-endpoints/publicize-services.php:150
+msgid "Sorry, Publicize is not available on your site right now."
+msgstr "Tyvärr, Publicize är inte tillgängligt på din webbplats just nu."
+
+#: _inc/jetpack-strings.php:702
+msgid "Take me to the new editor"
+msgstr "Ta mig till den nya redigeraren"
+
+#: _inc/jetpack-strings.php:701 _inc/jetpack-strings.php:704
+msgid "Jetpack is ready for the new WordPress editor"
+msgstr "Jetpack är redo för den nya WordPress-redigeraren"
+
+#: _inc/jetpack-strings.php:700
+msgid "Today, we are introducing the first wave of Jetpack-specific blocks built specifically for the new editor experience: Simple Payment button, Form, Map, and Markdown."
+msgstr "I dag introducerar vi den första vågen av Jetpack-specifika block som har utformats särskilt för den nya redigeraren: Enkel betalningsknapp, formulär, karta och Markdown."
+
+#: _inc/jetpack-strings.php:699
+msgid "Build your Jetpack site with blocks"
+msgstr "Bygg din Jetpack-webbplats med block"
+
+#: _inc/jetpack-strings.php:698
+msgid "A new editor? Yes! {{a}}Learn more{{/a}}."
+msgstr "En ny redigerare? Ja! {{a}}Läs mer{{/a}}."
+
+#: _inc/jetpack-strings.php:697
+msgid "The features you rely on, adapted for the new WordPress editor."
+msgstr "Funktionerna du förlitar dig på har anpassats till en ny WordPress-redigerare."
+
+#: _inc/jetpack-strings.php:705
+msgid "New in Jetpack!"
+msgstr "Nytt i Jetpack!"
+
+#: _inc/jetpack-strings.php:712
+msgid "Your site is verified with Google"
+msgstr "Din webbplats är verifierad med Google"
+
+#: _inc/jetpack-strings.php:714
+msgid "Monitor your site's traffic and performance from the {{a}}Google Search Console{{/a}}."
+msgstr "Övervaka din webbplats trafik och prestanda från{{a}}Google Search Console{{/a}}."
+
+#: _inc/jetpack-strings.php:707
+msgid "Site failed to verify: %(error)s"
+msgstr "Webbplats kunde inte verifieras: %(error)s"
+
+#: _inc/jetpack-strings.php:683
+msgid "Add faster, more advanced searching to your site with Jetpack Professional."
+msgstr "Lägg till snabbare och mer avancerad sökning för din webbplats med Jetpack Professional."
+
+#: _inc/jetpack-strings.php:599
+msgid "Create account"
+msgstr "Skapa konto"
+
+#: _inc/jetpack-strings.php:598
+msgid "Jetpack is powering your site, but to access all of its features you’ll need to create an account."
+msgstr "Jetpack ger kraft åt din webbplats, men för att få åtkomst till alla dess funktioner behöver du skapa ett konto."
+
+#: _inc/jetpack-strings.php:607
+msgid "This site can't be connected to WordPress.com because it violates our {{a}}Terms of Service{{/a}}."
+msgstr "Den här webbplatsen kan inte anslutas till WordPress.com eftersom den bryter mot våra {{a}}Användarvillkor{{/a}}."
+
+#: _inc/jetpack-strings.php:529
+msgctxt "Settings header"
+msgid "Widgets"
+msgstr "Widgetar"
+
+#: _inc/jetpack-strings.php:532
+msgid "Enable widget visibility controls to display widgets only on particular posts or pages"
+msgstr "Aktivera widgetvisningskontroller så att de endast visas på vissa inlägg eller sidor"
+
+#: _inc/jetpack-strings.php:531
+msgid "Widget visibility lets you decide which widgets appear on which pages, so you can finely tailor widget content."
+msgstr "Med widgetvisning kan du bestämma vilka widgetar som ska visas på vilka sidor så att du kan finanpassa widgetinnehållet."
+
+#: _inc/jetpack-strings.php:530
+msgid "Make extra widgets available for use on your site including subscription forms and Twitter streams"
+msgstr "Gör extra widgetar tillgängliga för användning på din webbplats, inklusive prenumerationsformulär och twitterflöden."
+
+#: _inc/jetpack-strings.php:528
+msgid "Enhance CSS customization panel"
+msgstr "Utvidga CSS-anpassningspanelen"
+
+#: _inc/jetpack-strings.php:496
+msgid "Writing"
+msgstr "Skriva"
+
+#: _inc/jetpack-strings.php:485
+msgid "Compose using shortcodes to embed media from popular sites"
+msgstr "Skriv med kortkod för att bädda in media från populära webbplatser"
+
+#: _inc/jetpack-strings.php:497
+msgid "Compose content the way you want to and streamline your publishing experience."
+msgstr "Skapa innehåll på det sätt som du önskar och strömlinjeforma din publiceringsupplevelse."
+
+#: _inc/jetpack-strings.php:495
+msgid "Add a portfolio item"
+msgstr "Lägg till ett portföljobjekt"
+
+#: _inc/jetpack-strings.php:491
+msgid "Add a testimonial"
+msgstr "Lägg till ett omdöme"
+
+#: _inc/jetpack-strings.php:482
+msgid "Duplicate existing posts, pages, Testimonials, and Portfolios. All the content will be copied including text, featured images, sharing settings, and more."
+msgstr "Kopiera befintliga inlägg, sidor, omdömen och portföljer. Allt innehåll kommer att kopieras, inklusive text, utvalda bilder, delningsinställningar, med mera."
+
+#: _inc/jetpack-strings.php:435
+msgid "Maximize your site’s visibility in search engines and view traffic stats in real time."
+msgstr "Maximera synligheten för din webbplats i sökmotorer och se statistik över trafiken i realtid."
+
+#: _inc/jetpack-strings.php:434
+msgid "Traffic"
+msgstr "Trafik"
+
+#: _inc/jetpack-strings.php:428
+msgid "When ads are enabled, Jetpack automatically generates a custom ads.txt tailored for your site."
+msgstr "När annonser är aktiverade genererar Jetpack automatiskt en anpassad ads.txt som är skräddarsydd för din webbplats."
+
+#: _inc/jetpack-strings.php:426 _inc/lib/class.core-rest-api-endpoints.php:2106
+msgid "Custom ads.txt entries"
+msgstr "Anpassade ads.txt-poster"
+
+#: _inc/jetpack-strings.php:403
+msgid "Connect your website to the social media networks you use and share your content across all your social accounts with a single click. When you publish a post, it will appear on all connected accounts."
+msgstr "Anslut din webbplats till de sociala medier du använder och dela innehållet på alla dina sociala konton med ett enda klick. När du publicerar ett inlägg visas det på alla anslutna konton."
+
+#: _inc/jetpack-strings.php:400 _inc/jetpack-strings.php:407
+#: _inc/jetpack-strings.php:503 _inc/jetpack-strings.php:512
+msgid "Create a Jetpack account to use this feature"
+msgstr "Skapa ett Jetpack-konto för att använda denna funktion"
+
+#: _inc/jetpack-strings.php:398
+msgid "Add Like buttons to your posts and pages"
+msgstr "Lägg till Gilla-knappar i dina inlägg och sidor"
+
+#: _inc/jetpack-strings.php:397
+msgid "When visitors enjoy your content, let them show it with a Like."
+msgstr "När besökare gillar ditt innehåll, låt dem visa det med ett Gilla-tryck."
+
+#: _inc/jetpack-strings.php:388
+msgid "Add an extra layer of security to your website by enabling WordPress.com login and secure authentication. If you have multiple sites with this option enabled, you will be able to log in to every one of them with the same credentials."
+msgstr "Lägg till ett extra säkerhetslager för din webbplats genom att aktivera WordPress.com-inloggning och säker autentisering. Om du har flera webbplatser med det här alternativet aktiverat kan du logga in på alla med samma uppgifter."
+
+#: _inc/jetpack-strings.php:377
+msgid "Jetpack will continuously monitor your site, and alert you the moment downtime is detected."
+msgstr "Jetpack övervakar din webbplats kontinuerligt och varnar dig direkt när ett driftstopp upptäcks."
+
+#: _inc/jetpack-strings.php:326
+msgid "Action needed"
+msgstr "Åtgärd behövs"
+
+#: _inc/jetpack-strings.php:353
+msgid "You need to enter your server credentials to finish configuring Backups and Scan."
+msgstr "Du behöver ange autentiseringsuppgifterna för din server för att kunna slutföra konfiguration av Säkerhetskopiera & Skanna."
+
+#: _inc/jetpack-strings.php:352
+msgid "Awaiting credentials"
+msgstr "Väntar autentiseringsuppgifter"
+
+#: _inc/jetpack-strings.php:351
+msgid "Backups and Scan are being configured for your site."
+msgstr "Säkerhetskopiera & Skanna konfigureras för din webbplats."
+
+#: _inc/jetpack-strings.php:350
+msgid "Provisioning"
+msgstr "Etablering"
+
+#: _inc/jetpack-strings.php:325
+msgid "Setting up"
+msgstr "Installation"
+
+#: _inc/jetpack-strings.php:296
+msgid "Error enabling Site accelerator. %(error)s"
+msgstr "Ett fel uppstod vid aktiveringen av webbplatsacceleratorn. %(error)s"
+
+#: _inc/jetpack-strings.php:295
+msgid "Site accelerator is now speeding up your site!"
+msgstr "Webbplatsacceleratorn kommer nu göra din webbplats snabbare!"
+
+#: _inc/jetpack-strings.php:294
+msgid "Enabling Site accelerator…"
+msgstr "Aktiverar webbplatsacceleratorn..."
+
+#: _inc/jetpack-strings.php:301
+msgid "Speed up static file load times"
+msgstr "Snabba upp laddningstiderna för statiska filer"
+
+#: _inc/jetpack-strings.php:300
+msgid "Speed up image load times"
+msgstr "Snabba upp laddningstiderna för bilder"
+
+#: _inc/jetpack-strings.php:299
+msgid "Enable site accelerator"
+msgstr "Aktivera webbplatsacceleratorn"
+
+#: _inc/jetpack-strings.php:298
+msgid "Load pages faster by allowing Jetpack to optimize your images and serve your images and static files (like CSS and JavaScript) from our global network of servers."
+msgstr "Ladda sidor snabbare genom att tillåta Jetpack att optimera dina bilder och servera dina bilder och statiska filer (såsom CSS och JavaScript) från vårt globala servernätverk."
+
+#: _inc/jetpack-strings.php:293
+msgid "Error disabling site accelerator. %(error)s"
+msgstr "Ett fel uppstod vid inaktiveringen av webbplatsacceleratorn. %(error)s"
+
+#: _inc/jetpack-strings.php:292
+msgid "Site accelerator is no longer speeding up your site!"
+msgstr "Webbplatsacceleratorn ökar inte längre hastigheten för din webbplats!"
+
+#: _inc/jetpack-strings.php:291
+msgid "Disabling site accelerator…"
+msgstr "Inaktivering av webbplatsacceleratorn."
+
+#: _inc/jetpack-strings.php:288
+msgid "Replace WordPress built-in search with Jetpack Search, an advanced search experience"
+msgstr "Ersätt WordPress inbyggda sökfunktion med Jetpack Sök, en avancerat sökupplevelse"
+
+#: _inc/jetpack-strings.php:287
+msgid "Jetpack Search replaces the built-in search with a fast, scalable, customizable, and highly-relevant search hosted in the WordPress.com cloud. The result: Your users find the content they want, faster."
+msgstr "Jetpack Sök ersätter den inbyggda sökningen med en snabb, skalbar, anpassningsbar och mycket relevant sökningsvärd i WordPress.com-molnet. Resultatet: Dina användare hittar det innehåll de vill ha, snabbare."
+
+#: _inc/jetpack-strings.php:280
+msgid "Load pages faster, optimize images, and speed up your visitors’ experience."
+msgstr "Ladda sidor snabbare, optimera bilder och skapa en snabbare upplevelse för dina besökare."
+
+#: _inc/jetpack-strings.php:286
+msgid "The built-in WordPress search is great for sites without much content. But as your site grows, searches slow down and return less relevant results."
+msgstr "Den inbyggda WordPress-sökningen är utmärkt för webbplatser som inte har så mycket innehåll. Men när din webbplats växer blir sökningarna saktare och returnerar mindre relevanta resultat."
+
+#: _inc/jetpack-strings.php:285
+msgid "Jetpack Search supports many customizations."
+msgstr "Jetpack Sök stöder många anpassningar."
+
+#: _inc/jetpack-strings.php:27
+msgid "Jetpack Business Plan"
+msgstr "Jetpacks Business-paket"
+
+#: _inc/jetpack-strings.php:24
+msgid "Jetpack Premium Plan"
+msgstr "Jetpacks Premium-paket"
+
+#: _inc/jetpack-strings.php:20
+msgid "Jetpack Personal Plan"
+msgstr "Jetpacks Personal-paket"
+
+#: _inc/jetpack-strings.php:23
+msgid "Spam filtering and priority support."
+msgstr "Skräppostfiltrering och prioriterad support."
+
+#: _inc/jetpack-strings.php:17
+msgid "Jetpack Free Plan"
+msgstr "Paketet Jetpacks Free"
+
+#: _inc/jetpack-strings.php:310
+msgid "Explore our Jetpack plans"
+msgstr "Utforska våra Jetpack-paket"
+
+#: _inc/jetpack-strings.php:268
+msgid "Support documentation"
+msgstr "Supportdokumentation"
+
+#: _inc/jetpack-strings.php:267
+msgid "Chat bubbles representing getting in touch with support"
+msgstr "Använd talbubblorna för att kontakta supporten"
+
+#: _inc/jetpack-strings.php:261
+msgid "Reach a wider audience by automatically sharing your posts on social media."
+msgstr "Nå ut till en större målgrupp genom att dela dina inlägg automatiskt på sociala medier."
+
+#: _inc/jetpack-strings.php:260
+msgid "Increase traffic to your site"
+msgstr "Öka trafiken till din webbplats"
+
+#: _inc/jetpack-strings.php:258
+msgid "Explore free themes"
+msgstr "Utforska gratisteman"
+
+#: _inc/jetpack-strings.php:257
+msgid "Get unlimited access to hundreds of professional themes, and customize your site exactly how you like it."
+msgstr "Få obegränsad åtkomst till hundratals professionella teman och anpassa din webbplats precis som du vill ha den."
+
+#: _inc/jetpack-strings.php:255
+msgid "A wide variety of themes and tools to customize a site"
+msgstr "Ett brett urval av teman och verktyg för att anpassa en webbplats"
+
+#: _inc/jetpack-strings.php:250
+msgid "Set up your site security"
+msgstr "Ställ in webbplatssäkerhet"
+
+#: _inc/jetpack-strings.php:249
+msgid "Prevent login attacks, and get instant notifications when there’s an issue with your site."
+msgstr "Förhindra inloggningsattacker och få aviseringar omedelbart när problem uppstår med din webbplats."
+
+#: _inc/jetpack-strings.php:264
+msgid "Site activity"
+msgstr "Webbplatsaktivitet"
+
+#: _inc/jetpack-strings.php:244
+msgid "Schedule unlimited tweets, Facebook posts, and other social posts in advance."
+msgstr "Tidsinställ obegränsat med tweets, Facebook-inlägg och andra sociala inlägg i förväg."
+
+#: _inc/jetpack-strings.php:235
+msgid "Complement WordPress.com’s stats with Google’s in-depth look at your visitors and traffic patterns."
+msgstr "Komplettera statistiken från WordPress.com med Googles djupgående analys av dina besökare och deras trafikmönster."
+
+#: _inc/jetpack-strings.php:243
+msgid "Marketing Automation"
+msgstr "Automatiserad marknadsföring"
+
+#: _inc/jetpack-strings.php:241
+msgid "Browse premium themes"
+msgstr "Bläddra bland premiumteman."
+
+#: _inc/jetpack-strings.php:240
+msgid "Access hundreds of beautifully designed premium themes at no extra cost."
+msgstr "Få tillgång till hundratals vackert designade premium-teman utan extra kostnad."
+
+#: _inc/jetpack-strings.php:239
+msgid "Try a premium theme"
+msgstr "Testa ett premiumtema"
+
+#: _inc/jetpack-strings.php:228 _inc/jetpack-strings.php:233
+#: _inc/jetpack-strings.php:259
+msgid "Site stats showing an evolution in traffic and engagement"
+msgstr "Webbplatsstatistik visar utvecklingen av trafik och användning"
+
+#: _inc/jetpack-strings.php:223
+msgid "A hand holding a loupe"
+msgstr "En hand som håller ett förstoringsglas"
+
+#: _inc/jetpack-strings.php:218
+msgid "A chart showing an healthy increase in earnings"
+msgstr "En tabell som visar goda ökade intäkter"
+
+#: _inc/jetpack-strings.php:214 _inc/jetpack-strings.php:263
+msgid "Interface showing a chronological list of changes and updates in a site"
+msgstr "Ett gränssnitt som visar en kronologisk lista över ändringar och uppdateringar på en webbplats"
+
+#: _inc/jetpack-strings.php:209
+msgid "A cloud with multiple types of content floating around it"
+msgstr "Ett moln med många typer av innehåll som svävar omkring det"
+
+#: _inc/jetpack-strings.php:227
+msgid "Activate Jetpack Search"
+msgstr "Aktivera Jetpack-sökning"
+
+#: _inc/jetpack-strings.php:211
+msgid "High-speed, high-definition video hosting with no third-party ads."
+msgstr "Högupplöst videovisning med hög hastighet, utan annonser från tredje part."
+
+#: _inc/jetpack-strings.php:225
+msgid "Replace the default WordPress search with better results and filtering powered by Elasticsearch."
+msgstr "Ersätt WordPress standardsökning med bättre resultat och filtrering via Elasticsearch."
+
+#: _inc/jetpack-strings.php:222
+msgid "Start earning"
+msgstr "Börja tjäna pengar"
+
+#: _inc/jetpack-strings.php:220
+msgid "WordAds lets you earn money by displaying promotional content. Start earning today."
+msgstr "WordAds gör att du kan tjäna pengar genom att visa reklaminnehåll. Börja tjäna pengar idag."
+
+#: _inc/jetpack-strings.php:217 _inc/jetpack-strings.php:266
+msgid "View your site activity"
+msgstr "Visa din webbplatsaktivitet"
+
+#: _inc/jetpack-strings.php:216 _inc/jetpack-strings.php:265
+msgid "View a chronological list of all the changes and updates to your site in an organized, readable way."
+msgstr "Visa en kronologisk lista över alla ändringar och uppdateringar på din webbplats på ett organiserat, läsbart sätt."
+
+#: _inc/jetpack-strings.php:175
+msgid "Discussion"
+msgstr "Diskussion"
+
+#: _inc/jetpack-strings.php:149
+msgid "We are configuring your site protection."
+msgstr "Vi konfigurerar skyddet för din webbplats."
+
+#: _inc/jetpack-strings.php:204
+msgid "A folder holding real comments"
+msgstr "En mapp som innehåller verkliga kommentarer"
+
+#: _inc/jetpack-strings.php:203 _inc/jetpack-strings.php:254
+msgid "Make your site faster"
+msgstr "Gör din webbplats snabbare"
+
+#: _inc/jetpack-strings.php:202 _inc/jetpack-strings.php:253
+msgid "Load pages faster by serving your images from our global network of servers."
+msgstr "Ladda sidor snabbare genom att lägga upp dina bilder från vårt globala servernätverk."
+
+#: _inc/jetpack-strings.php:200 _inc/jetpack-strings.php:251
+msgid "A fast and performant website"
+msgstr "En snabb och högpresterande webbplats"
+
+#: _inc/jetpack-strings.php:184 _inc/jetpack-strings.php:191
+#: _inc/jetpack-strings.php:238 _inc/jetpack-strings.php:242
+#: _inc/jetpack-strings.php:247
+msgid "A secure site, locked and protected by Jetpack"
+msgstr "En säker webbplats som är låst och skyddad av Jetpack"
+
+#: _inc/jetpack-strings.php:206
+msgid "Spam is automatically blocked from your comments."
+msgstr "Skräppost blockeras automatiskt från dina kommentarer."
+
+#: _inc/jetpack-strings.php:205
+msgid "Spam Filtering"
+msgstr "Skräppostfiltrering"
+
+#: _inc/jetpack-strings.php:195 _inc/jetpack-strings.php:208
+msgid "View settings"
+msgstr "Visa inställningar"
+
+#: _inc/jetpack-strings.php:178
+msgid "Create a Jetpack account to view your email followers"
+msgstr "Skapa ett Jetpack-konto för att visa dina prenumeranter av e-post"
+
+#: _inc/jetpack-strings.php:99
+msgid "View your site's backups"
+msgstr "Visa din webbplats säkerhetskopior"
+
+#: _inc/jetpack-strings.php:98
+msgid "We are backing up your site in real-time."
+msgstr "Vi säkerhetskopierar din webbplats i realtid."
+
+#: _inc/jetpack-strings.php:97 _inc/jetpack-strings.php:151
+msgid "Enter credentials"
+msgstr "Ange autentiseringsuppgifter"
+
+#: _inc/jetpack-strings.php:96 _inc/jetpack-strings.php:150
+msgid "You need to enter your server's credentials to finish the setup."
+msgstr "Du behöver ange autentiseringsuppgifterna för din server för att slutföra installationen."
+
+#: _inc/jetpack-strings.php:95
+msgid "We are configuring your site's backups."
+msgstr "Vi konfigurerar din webbplats säkerhetskopior."
+
+#: _inc/jetpack-strings.php:78
+msgid "View site activity"
+msgstr "Visa webbplatsaktivitet"
+
+#: _inc/jetpack-strings.php:75
+msgid "Jetpack keeps a complete record of everything that happens on your site, taking the guesswork out of site management, debugging, and repair."
+msgstr "Jetpack håller ett fullständigt register över allt som händer på din webbplats, vilket gör att du slipper gissa när det kommer till webbplatshantering, felsökning och reparation."
+
+#: _inc/jetpack-strings.php:12 _inc/jetpack-strings.php:669
+msgctxt "Navigation item."
+msgid "Performance"
+msgstr "Prestanda"
+
+#: _inc/jetpack-strings.php:111
+msgid "Manage security settings"
+msgstr "Hantera säkerhetsinställningar"
+
+#: _inc/jetpack-strings.php:6 _inc/jetpack-strings.php:664
+msgctxt "Navigation item."
+msgid "My Plan"
+msgstr "Mitt paket"
+
+#: _inc/jetpack-strings.php:36
+msgid "Testing Jetpack Connection"
+msgstr "Testar Jetpack-anslutning"
+
+#: _inc/jetpack-strings.php:37
+msgid "There was an error testing Jetpack. Error: %(error)s"
+msgstr "Det uppstod ett fel när Jetpack testades. Fel: %(error)s"
+
+#: _inc/jetpack-strings.php:65
+msgid "Site is verified"
+msgstr "Webbplats är verifierad"
+
+#: class.jetpack-connection-banner.php:375
+msgid "Activate site accelerator tools and watch your page load times decrease—we'll optimize your images and serve them from our own powerful global network of servers, and speed up your mobile site to reduce bandwidth usage."
+msgstr "Aktivera accelerationssverktyg och se din webbplats ladda snabbare. Vi optimerar dina bilder och skickar dem från vårt egna globala nätverk och gör din mobilwebbplats snabbare för att minska dess bandbreddsanvändning."
+
+#: class.jetpack-connection-banner.php:330
+msgid "Activate essential WordPress security and performance tools by setting up Jetpack"
+msgstr "Aktivera viktiga säkerhets- och prestandaverktyg från WordPress genom att installera Jetpack"
+
+#: class.jetpack-connection-banner.php:369
+msgid "Built-in Performance"
+msgstr "Inbyggd prestanda"
+
+#: class.jetpack-connection-banner.php:279
+msgid "Activate site accelerator tools and watch your page load times decrease—we’ll optimize your images and serve them from our own powerful global network of servers, and speed up your mobile site to reduce bandwidth usage."
+msgstr "Aktivera accelerationssverktyg för din webbplats och se hur dina sidladdningstider minskar—vi optimerar dina bilder och betjänar dem från vårt eget kraftfulla globala nätverk av servrar och snabbar upp din mobila webbplats för att minska användningen av bandbredd."
+
+#: class.jetpack-connection-banner.php:268
+#: class.jetpack-connection-banner.php:355
+msgid "Jetpack protects you against brute force attacks and unauthorized logins. Basic protection is always free, while premium plans add unlimited backups of your whole site, spam protection, malware scanning, and automated fixes."
+msgstr "Jetpack skyddar dig mot brute force-attacker och obehöriga inloggningar. Grundläggande skydd är alltid gratis medan premiumpaket lägger till obegränsad säkerhetskopiering av hela din webbplats, skydd mot skräppost, avsökning efter skadlig programvara och automatiska reparationer."
+
+#: class.jetpack-connection-banner.php:264
+msgid "Simplify your site security and performance with Jetpack"
+msgstr "Förenkla din webbplatssäkerhet och -prestanda med Jetpack"
+
+#: class.jetpack-connection-banner.php:213
+msgid "You’re almost done. Set up Jetpack to enable powerful security and performance tools for WordPress."
+msgstr "Du är nästan klar. Installera Jetpack för att aktivera kraftfulla säkerhets- och prestandaverktyg för WordPress."
+
+#: class.jetpack-connection-banner.php:251
+msgid "Jetpack premium services offer even more powerful performance, security, and revenue tools to help you keep your site safe, fast, and help generate income."
+msgstr "Jetpack premium-tjänster erbjuder ännu kraftfullare prestanda, säkerhet och verktyg för intäkter för att hålla din webbplats säker, snabb och för att hjälpa till att skapa intäkter."
+
+#. Translators: placeholders are links.
+#: functions.global.php:154
+msgid "By clicking the Set up Jetpack button, you agree to our Terms of Service and to share details with WordPress.com."
+msgstr "Genom att klicka på knappen Konfigurera Jetpack så godkänner du våra Tjänstvillkor samt att dela information med WordPress.com."
+
+#: class.jetpack-network.php:393
+msgid "Site connection failed!"
+msgstr "Webbplatsanslutning misslyckades!"
+
+#: _inc/lib/debugger/class-jetpack-debugger.php:102 class.jetpack-admin.php:263
+msgid "Debugging Center"
+msgstr "Felsökningscenter"
+
+#: modules/wpcom-block-editor/class-jetpack-wpcom-block-editor.php:295
+msgid "Underline"
+msgstr "Understrykning"
+
+#: modules/wpcom-block-editor/class-jetpack-wpcom-block-editor.php:294
+msgid "Justify"
+msgstr "Justera"
+
+#: modules/wpcom-block-editor/class-jetpack-wpcom-block-editor.php:290
+msgid "Switch to Classic Editor"
+msgstr "Växla till den klassiska redigeraren"
+
+#: modules/likes.php:629
+msgid "Are Likes enabled?"
+msgstr "Är Gilla aktiverat?"
+
+#: modules/module-headings.php:217
+msgctxt "Module Description"
+msgid "Provides additional widgets for use on your site."
+msgstr "Tillhandahåller fler widgetar som du kan använda på din webbplats."
+
+#: modules/plugin-search.php:211
+msgid "by Jetpack (installed)"
+msgstr "från Jetpack (installerat)"
+
+#: modules/plugin-search.php:218
+msgid "This suggestion was made by Jetpack, the security and performance plugin already installed on your site."
+msgstr "Det här förslaget kommer från Jetpack, säkerhets- och prestandatillägget som redan finns installerat på din webbplats."
+
+#: modules/plugin-search.php:222
+msgid "Learn more about these suggestions."
+msgstr "Läs mer om de här förslagen."
+
+#: modules/sharedaddy/sharing.php:606
+msgid "Are sharing buttons enabled?"
+msgstr "Har delningsknapparna aktiverats?"
+
+#: modules/module-headings.php:197
+msgctxt "Module Description"
+msgid "Protect your site with daily or real-time backups and automated virus scanning and threat detection."
+msgstr "Skydda din webbplats med säkerhetskopiering dagligen eller i realtid samt automatisk virusgenomsökning och upptäckt av hot."
+
+#: modules/module-headings.php:207
+msgctxt "Module Description"
+msgid "Save on hosting storage and bandwidth costs by streaming fast, ad-free video from our global network."
+msgstr "Spara på lagrings- och bandbreddskostnader genom att streama snabb, reklamfri video från vårt globala nätverk."
+
+#: modules/plugin-search.php:497
+msgid "Enable"
+msgstr "Aktivera"
+
+#: modules/plugin-search.php:350
+msgctxt "Jetpack: Module Name"
+msgid "Jetpack: %s"
+msgstr "Jetpack: %s"
+
+#: modules/plugin-search.php:227 modules/plugin-search.php:540
+msgid "Hide this suggestion"
+msgstr "Dölj det här förslaget"
+
+#: modules/plugin-search.php:213
+msgid "Activate Module"
+msgstr "Aktivera modul"
+
+#: modules/plugin-search.php:147
+msgid "The card could not be dismissed"
+msgstr "Kortet kunde inte avfärdas"
+
+#: modules/plugin-search.php:273
+msgid "Keep your visitors and search engines happy by stopping comment and contact form spam with Akismet."
+msgstr "Håll dina besökare och sökmotorer nöjda genom att stoppa kommentar och kontakter från spam med Akismet."
+
+#: modules/copy-post.php:303
+msgid "Copy"
+msgstr "Kopiera"
+
+#: modules/copy-post.php:302
+msgid "Copy this post."
+msgstr "Kopiera detta inlägg."
+
+#: modules/contact-form/grunion-contact-form.php:2319
+msgid "Choose one"
+msgstr "Välj en"
+
+#: modules/contact-form/grunion-contact-form.php:2311
+#: _inc/blocks/editor-beta.js:24 _inc/blocks/editor.js:24
+msgid "Phone"
+msgstr "Telefon"
+
+#: modules/contact-form/grunion-contact-form.php:2317
+msgid "Choose several"
+msgstr "Välj flera"
+
+#: modules/contact-form/grunion-contact-form.php:2321
+msgid "Select one"
+msgstr "Välj en"
+
+#: modules/plugin-search.php:216
+msgid "Activating"
+msgstr "Aktiverar"
+
+#: modules/verification-tools/blog-verification-tools.php:78
+msgid "You can verify your site using the \"Site verification\" tool in Jetpack Settings."
+msgstr "Du kan verifiera din webbplats med hjälp av verktyget ”Webbplatsverifiering\" Jetpack-inställningarna."
+
+#: modules/plugin-search.php:214 modules/plugin-search.php:485
+#: modules/plugin-search.php:522
+msgid "Get started"
+msgstr "Kom igång"
+
+#: modules/sharedaddy/sharing-sources.php:282
+#: modules/sharedaddy/sharing-sources.php:425
+msgid "%1$s has shut down"
+msgstr "%1$s har stängts ner"
+
+#: modules/sharedaddy/sharing-sources.php:277
+#: modules/sharedaddy/sharing-sources.php:426
+#: modules/sharedaddy/sharing.php:184
+msgid "The %1$s service has shut down. This sharing button is not displayed to your visitors and should be removed."
+msgstr "Tjänsten %1$s har stängts ner. Den här delningsknappen visas inte för dina besökare och bör tas bort."
+
+#: modules/module-headings.php:167
+msgctxt "Module Description"
+msgid "Generates shorter links so you can have more space to write on social media sites."
+msgstr "Skapar kortare länkar så att du har mer utrymme för att skriva på sociala medier."
+
+#: modules/module-headings.php:162
+msgctxt "Module Description"
+msgid "Shortcodes are WordPress-specific markup that let you add media from popular sites. This feature is no longer necessary as the editor now handles media embeds rather gracefully."
+msgstr "Kortkoder är ett WordPress-specifikt märkspråk som låter dig lägga till media från populära webbplatser. Denna funktion är inte längre nödvändig eftersom redigeraren nu hanterar mediainbäddning smidigt."
+
+#: modules/module-headings.php:196
+msgctxt "Module Name"
+msgid "Backups and Scanning"
+msgstr "Säkerhetskopieringar och skanning"
+
+#: modules/module-headings.php:147
+msgctxt "Module Description"
+msgid "Enhanced search, powered by Elasticsearch, a powerful replacement for WordPress search."
+msgstr "Förbättrad sökning, drivs av Elasticsearch, en kraftfull ersättning för WordPress-sökning."
+
+#: modules/module-headings.php:137
+msgctxt "Module Description"
+msgid "Publicize makes it easy to share your site’s posts on several social media networks automatically when you publish a new post."
+msgstr "Med Offentliggör är det enkelt att dela dina webbplatsinlägg på flera sociala medianätverk automatiskt när du publicerar ett nytt inlägg."
+
+#: modules/module-headings.php:122
+msgctxt "Module Description"
+msgid "Mirrors and serves your images from our free and fast image CDN, improving your site’s performance with no additional load on your servers."
+msgstr "Speglar och servar dina bilder från vår kostnadsfria och snabba bild-CDN, vilket ger din webbplats förbättrad prestanda utan att dina servrar utsätts för extra belastning."
+
+#: modules/module-headings.php:121
+msgctxt "Module Name"
+msgid "Image CDN"
+msgstr "Bild-CDN"
+
+#: modules/module-headings.php:117
+msgctxt "Module Description"
+msgid "Jetpack’s Site Accelerator loads your site faster by optimizing your images and serving your images and static files from our global network of servers."
+msgstr "Jetpacks webbplatsaccelerator laddar dina sidor snabbare genom att optimera dina bilder och serverar dina bilder och statiska filer från vårt globala servernätverk."
+
+#: modules/module-headings.php:107
+msgctxt "Module Description"
+msgid "Jetpack’s downtime monitoring will continuously watch your site, and alert you the moment that downtime is detected."
+msgstr "Jetpacks driftstoppsövervakning håller koll på din webbplats och varnar dig direkt när ett driftstopp upptäcks."
+
+#: modules/module-headings.php:116
+msgctxt "Module Name"
+msgid "Asset CDN"
+msgstr "Tillgångs-CDN"
+
+#: modules/module-headings.php:47
+msgctxt "Module Description"
+msgid "Adds options for CSS preprocessor use, disabling the theme's CSS, or custom image width."
+msgstr "Lägger till alternativ för användning av CSS-förprocessor, vilket avaktiverar temats CSS, eller anpassad bildbredd."
+
+#: modules/module-headings.php:82
+msgctxt "Module Description"
+msgid "Speed up your site and create a smoother viewing experience by loading images as visitors scroll down the screen, instead of all at once."
+msgstr "Förbättra din webbplats hastighet och skapa en jämnare visningsupplevelse genom att läsa in bilder allteftersom besökare bläddrar nedåt på skärmen, istället för alla på en gång."
+
+#: modules/module-headings.php:32
+msgctxt "Module Description"
+msgid "Add a customizable contact form to any post or page using the Jetpack Form Block."
+msgstr "Lägg till ett anpassningsbart kontaktformulär till en post eller sida med hjälp av Jetpack Form Block."
+
+#: modules/module-headings.php:36
+msgctxt "Module Name"
+msgid "Copy Post"
+msgstr "Kopiera inlägg"
+
+#: modules/module-info.php:893
+msgid "Create a new post based on an existing post."
+msgstr "Skapa ett nytt inlägg baserat på ett befintligt inlägg."
+
+#: modules/module-info.php:873
+msgid ""
+"Our asset CDN is a site acceleration service.\n"
+"\t\tThat means that we host static assets like JavaScript and CSS shipped with WordPress Core and Jetpack from our servers, alleviating the load on your server."
+msgstr ""
+"Vårt innehållsleveransnätverk (CDN) är en accelereringstjänst för webbplatser.\n"
+"\t\tDet betyder att vi är värd för statiska tillgångar som JavaScript och CSS som levereras med WordPress Core och Jetpack från våra servrar, vilket lindrar belastningen på din egen server."
+
+#: modules/module-headings.php:77
+msgctxt "Module Description"
+msgid "Use the LaTeX markup language to write mathematical equations and formulas"
+msgstr "Använd märkspråket LaTex för att skriva matematiska ekvationer och formler"
+
+#: modules/module-info.php:854
+msgid "Increase visitor engagement by adding a Like button to comments."
+msgstr "Öka besökarnas engagemang genom att lägga till en Gilla-knapp till kommentarer."
+
+#: modules/module-info.php:835
+msgid "Enhanced search, powered by Elasticsearch, a powerful replacement for WordPress search."
+msgstr "Förbättrad sökning, drivs av Elasticsearch, en kraftfull ersättning för WordPress-sökning."
+
+#: modules/module-info.php:396
+msgid ""
+"Quickly access your Stats, Notifications, Posts and more on WordPress.com.\n"
+"\t\tThe Toolbar is displayed for any user on the site that is connected to WordPress.com."
+msgstr "Snabb tillgång till din statistik, dina meddelanden, inlägg med mera på WordPress.com. Verktygsfältet visas för alla användare på webbplatsen som är anslutna till WordPress.com."
+
+#: modules/memberships/class-jetpack-memberships.php:226
+msgid "Powered by WordPress.com"
+msgstr "Drivs med WordPress.com"
+
+#: modules/memberships/class-jetpack-memberships.php:225
+msgid "Your contribution"
+msgstr "Ditt bidrag"
+
+#: modules/seo-tools/jetpack-seo.php:175
+msgctxt "10 posts published by John on May 30, 2012"
+msgid "%1$s post published by %2$l on %3$s"
+msgid_plural "%1$s posts published by %2$l on %3$s"
+msgstr[0] "%1$s inlägg har publicerats av %2$l den %3$s"
+msgstr[1] "%1$s inlägg har publicerats av %2$l den %3$s"
+
+#: modules/seo-tools/jetpack-seo.php:162
+msgctxt "10 posts publishes by John during May 2012"
+msgid "%1$s post published by %2$l during %3$s"
+msgid_plural "%1$s posts published by %2$l during %3$s"
+msgstr[0] "%1$s inlägg har publicerats av %2$l under %3$s"
+msgstr[1] "%1$s inlägg har publicerats av %2$l under %3$s"
+
+#: modules/seo-tools/jetpack-seo.php:152
+msgctxt "10 posts published by John in the year 2012"
+msgid "%1$s post published by %2$l in the year %3$s"
+msgid_plural "%1$s posts published by %2$l in the year %3$s"
+msgstr[0] "%1$s inlägg har publicerats av %2$lunder året %3$s"
+msgstr[1] "%1$s inlägg har publicerats av %2$lunder året %3$s"
+
+#: modules/subscriptions/views.php:533
+msgid "Follow"
+msgstr "Följ"
+
+#: modules/subscriptions/views.php:531
+msgid "You are following this blog"
+msgstr "Du följer denna blogg"
+
+#: modules/subscriptions/views.php:530
+msgid "Follow Blog via Email"
+msgstr "Följ bloggen via e-post"
+
+#: modules/subscriptions/views.php:618
+msgid "Show total number of followers? (%s follower)"
+msgid_plural "Show total number of followers? (%s followers)"
+msgstr[0] "Visa totalt antal följare? (%s följare)"
+msgstr[1] "Visa totalt antal följare? (%s följare)"
+
+#: modules/subscriptions/views.php:607
+msgid "Follow Button Text:"
+msgstr "Följ-knappens text:"
+
+#: modules/subscriptions/views.php:599
+msgid "Optional text to display to non-WordPress.com users:"
+msgstr "Frivillig text att visa för andra än WordPress.com-användare:"
+
+#: modules/subscriptions/views.php:591
+msgid "Optional text to display to logged in WordPress.com users:"
+msgstr "Valfri text som ska visas för inloggade WordPress.com-användare:"
+
+#: modules/subscriptions/views.php:583
+msgid "Widget title for followers:"
+msgstr "Widgetrubrik för följare:"
+
+#: modules/subscriptions/views.php:575
+msgid "Widget title for non-followers:"
+msgstr "Widgetrubrik för icke-följare:"
+
+#: modules/subscriptions/views.php:534
+msgid "Click to follow this blog and receive notifications of new posts by email."
+msgstr "Klicka för att följa denna blogg och få meddelanden om nya inlägg via e-post."
+
+#: modules/subscriptions/views.php:532
+msgid "Enter your email address to follow this blog and receive notifications of new posts by email."
+msgstr "Ange din e-postadress för att följa denna blogg och få meddelanden om nya inlägg via e-post."
+
+#. translators: %s: number of folks following the blog
+#: modules/subscriptions/views.php:269 modules/subscriptions/views.php:279
+msgid "Join %s other follower"
+msgid_plural "Join %s other followers"
+msgstr[0] "Gör sällskap med %s annan följare"
+msgstr[1] "Gör sällskap med %s andra följare"
+
+#: modules/subscriptions/views.php:226
+msgid "You are following this blog (manage)."
+msgstr "Du följer denna blogg (hantera)."
+
+#: modules/subscriptions/views.php:223
+msgid "You are following this blog, along with %s other amazing person (manage)."
+msgid_plural "You are following this blog, along with %s other amazing people (manage)."
+msgstr[0] "Du följer den här bloggen tillsammans med %s annan spännande person (hantera)."
+msgstr[1] "Du följer den här bloggen tillsammans med %s andra spännande personer (hantera)."
+
+#: modules/subscriptions/views.php:197
+msgid "Congrats, you’re subscribed! You’ll get an email with the details of your subscription and an unsubscribe link."
+msgstr "Grattis, du prenumererar! Du får ett e-postmeddelande med information om prenumerationen och en länk för att säga upp den."
+
+#: modules/subscriptions/views.php:192
+msgid "You have a pending subscription already; we just sent you another email. Click the link or contact us if you don’t receive it."
+msgstr "Du har redan en väntande prenumeration, vi skickade just ett nytt e-postmeddelande. Klicka på länken eller kontakta oss om du inte får det."
+
+#: modules/subscriptions/views.php:187
+msgid "You’re already subscribed to this site."
+msgstr "Du prenumererar redan på denna webbplats."
+
+#: modules/subscriptions/views.php:182
+msgid "Because there are many pending subscriptions for this email address, we have blocked the subscription. Please activate or delete pending subscriptions before attempting to subscribe."
+msgstr "Eftersom det finns många väntande prenumerationer för den här e-postadressen, har vi blockerat prenumerationen. Aktivera eller ta bort väntande prenumerationer innan du försöker prenumerera."
+
+#: modules/subscriptions/views.php:177
+msgid "You already have several pending email subscriptions. Approve or delete a few through your Subscription Manager before attempting to subscribe to more blogs."
+msgstr "Du har redan flera pågående e-postprenumerationer. Godkänn eller radera några via din Prenumerationshanterare innan du försöker prenumerera på fler bloggar."
+
+#: modules/subscriptions/views.php:172
+msgid "Subscriptions have been blocked for this email address."
+msgstr "Prenumerationer har blockerats för den här e-postadressen."
+
+#: modules/subscriptions/views.php:167
+msgid "Thanks for subscribing! You’ll get an email with a link to confirm your subscription. If you don’t get it, please contact us."
+msgstr "Tack för att du prenumererar! Du får snart ett e-postmeddelande med en länk för att bekräfta prenumerationen. Kontakta oss om du inte får det."
+
+#: modules/publicize/ui.php:493 _inc/blocks/editor-beta.js:24
+#: _inc/blocks/editor.js:24
+msgid "Go to Sharing settings"
+msgstr "Gå till delningsinställningarna"
+
+#. translators: %s is the name of a Pubilicize service like "LinkedIn"
+#: modules/publicize/ui.php:483
+msgid "Your %s connection needs to be reauthenticated to continue working – head to Sharing to take care of it."
+msgstr "Din %s-anslutning måste återautentiseras för att fortsätta fungera. Gå till Delning för att hantera det."
+
+#: modules/publicize/ui.php:102
+msgid "We've made some updates to Publicize. Please visit the WordPress.com sharing page to manage your publicize connections or use the button below."
+msgstr "Vi har gjort några uppdateringar i Offentliggör. Besök delningssidan på WordPress.com för att hantera dina publiceringsanslutningar, eller använd knappen nedan."
+
+#: modules/publicize/ui.php:110
+msgid "Publicize Settings"
+msgstr "Publicize-inställningar"
+
+#: modules/publicize/publicize.php:519 _inc/blocks/editor-beta.js:24
+#: _inc/blocks/editor.js:24
+msgid "Your LinkedIn connection needs to be reauthenticated to continue working – head to Sharing to take care of it."
+msgstr "Din LinkedIn-anslutning måste återautentiseras för att fortsätta fungera. Gå till Delning för att hantera det."
+
+#: modules/publicize/ui.php:98
+msgid "Connect social media services to automatically share new posts."
+msgstr "Anslut sociala mediatjänster för att dela nya inlägg automatiskt."
+
+#: modules/publicize/publicize.php:856
+msgid "The message to use instead of the title when sharing to Publicize Services"
+msgstr "Meddelandet som ska användas istället för rubriken när du delar till publiceringstjänster"
+
+#: modules/publicize/publicize.php:511
+msgid "Please select a Facebook Page to publish updates."
+msgstr "Välj en Facebook-sida för att publicera uppdateringar."
+
+#: modules/sso.php:1116
+msgid "You've successfully signed in with WordPress.com Secure Sign On!"
+msgstr "Du har nu loggat in med WordPress.com säker inloggning!"
+
+#: modules/sso.php:1119
+msgid "Interested in learning more about how Secure Sign On keeps your site safer?"
+msgstr "Intresserad av att lära dig mer om hur säkert inloggning håller din webbplats säkrare?"
+
+#: modules/simple-payments/simple-payments.php:368
+msgid "Simple payments; status."
+msgstr "Enkla betalningar; status."
+
+#: modules/simple-payments/simple-payments.php:360
+msgid "Simple payments button; paypal email."
+msgstr "Knapp för enkla betalningar; PayPal-e-post"
+
+#: modules/simple-payments/simple-payments.php:351
+msgid "Simple payments; allow multiple items"
+msgstr "Enkla betalningar; tillåt flera objekt"
+
+#: modules/simple-payments/simple-payments.php:342
+msgid "Simple payments; text with \"Buy\" or other CTA"
+msgstr "Enkla betalningar; text med \"Köp\" eller annan CTA"
+
+#: modules/simple-payments/simple-payments.php:333
+msgid "Simple payments; currency code."
+msgstr "Enkla betalningar; valutakod."
+
+#: modules/simple-payments/simple-payments.php:324
+msgid "Simple payments; price."
+msgstr "Enkla betalningar; pris."
+
+#: modules/sitemaps/sitemaps.php:157
+msgid "No sitemap found. Please try again later."
+msgstr "Ingen webbplatskarta hittades. Försök igen senare."
+
+#. translators: %s is a human_time_diff until next sitemap generation.
+#: modules/sitemaps/sitemap-stylist.php:198 modules/sitemaps/sitemaps.php:161
+msgid "No sitemap found. The system will try to build it again in %s."
+msgstr "Ingen webbplatskarta hittades. Systemet kommer att försöka bygga den igen om %s."
+
+#: modules/sso.php:194
+msgid "Secure Sign On"
+msgstr "Säker inloggning"
+
+#: modules/sitemaps/sitemap-builder.php:153
+msgid "Jetpack can not load necessary XML manipulation libraries. Please ask your hosting provider to refer to our server requirements at https://jetpack.com/support/server-requirements/ ."
+msgstr "Jetpack kan inte ladda nödvändiga XML-manipuleringsbibliotek. Be ditt webbhotell att hänvisa dig till våra serverkrav på https://jetpack.com/support/server-requirements/ ."
+
+#: modules/widgets/blog-stats.php:153
+msgid "There was an issue retrieving stats. Please try again later."
+msgstr "Ett fel uppstod vid hämtning av statistik. Försök igen senare."
+
+#: modules/widgets/search.php:276
+msgid "Jetpack Search not supported in Development Mode"
+msgstr "Jetpack Sök stöds inte i utvecklingsläget"
+
+#: modules/widgets/rsslinks-widget.php:218
+#: modules/widgets/rsslinks-widget.php:221
+msgid "RSS - "
+msgstr "RSS - "
+
+#: modules/widgets/simple-payments.php:324 _inc/blocks/editor-beta.js:24
+#: _inc/blocks/editor.js:24
+msgid "Invalid price"
+msgstr "Ogiltigt pris"
+
+#: modules/shortcodes/unavailable.php:76
+msgid "The Email Subscribe shortcode is now available as a block in the Block editor."
+msgstr "Kortkoden för e-postprenumeration är nu tillgänglig som ett block i blockredigeraren."
+
+#: modules/shortcodes/unavailable.php:75
+msgid "The Google Video embed service is not available anymore, it has been replaced by YouTube."
+msgstr "Google Video-inbäddningstjänsten är inte tillgänglig längre. Den har ersatts av YouTube."
+
+#: modules/shortcodes/unavailable.php:73
+msgid "The Digg API was shut down in 2014."
+msgstr "Digg-API:t stängdes ner 2014."
+
+#: modules/shortcodes/gist.php:140
+msgid "The Gist ID you provided is not valid. Please try a different one."
+msgstr "Det angivna Gist-ID:t är inte giltigt. Prova ett annat."
+
+#: modules/shortcodes/gist.php:128
+msgid "Please specify a Gist URL or ID."
+msgstr "Ange URL eller ID för Gist."
+
+#: modules/shortcodes/crowdsignal.php:339
+msgid "Take Our Poll"
+msgstr "Svara på vår enkät"
+
+#: modules/shortcodes/unavailable.php:77
+msgid "Lytro has been shut down since March 2019."
+msgstr "Lytro har varit stängt sedan mars 2019."
+
+#: modules/related-posts/jetpack-related-posts.php:597
+msgid "The following settings will impact all related posts on your site, except for those you created via the block editor:"
+msgstr "Följande inställningar kommer påverka alla relaterade poster på din webbplats, med undantag för dem du skapade via blockredigeraren:"
+
+#: modules/calypsoify/class.jetpack-calypsoify.php:133
+msgid "Disable Automatic Updates"
+msgstr "Inaktivera automatiska uppdateringar"
+
+#: modules/calypsoify/class.jetpack-calypsoify.php:132
+msgid "Enable Automatic Updates"
+msgstr "Aktivera automatiska uppdateringar"
+
+#: modules/calypsoify/class.jetpack-calypsoify.php:161
+msgid "Disabled automatic updates on %d plugin."
+msgid_plural "Disabled automatic updates on %d plugins."
+msgstr[0] "Inaktiverade automatiska uppdateringar för tillägget %d."
+msgstr[1] "Inaktiverade automatiska uppdateringar för tilläggen %d."
+
+#: modules/calypsoify/class.jetpack-calypsoify.php:158
+msgid "Enabled automatic updates on %d plugin."
+msgid_plural "Enabled automatic updates on %d plugins."
+msgstr[0] "Aktiverade automatiska uppdateringar för tillägget %d."
+msgstr[1] "Aktiverade automatiska uppdateringar för tilläggen %d."
+
+#: modules/calypsoify/class.jetpack-calypsoify.php:248
+msgid "Plugin Settings"
+msgstr "Tilläggsinställningar"
+
+#. translators: %s is a URL
+#: class.jetpack.php:5744
+msgid "Your site is incorrectly double-encoding redirects from http to https. This is preventing Jetpack from authenticating your connection. Please visit our support page for details about how to resolve this."
+msgstr "Din webbplats dubbelkodar omdirigeringar felaktigt från http till https. Detta hindrar Jetpack från att autentisera din anslutning. Besök vår supportsida för information om att lösa detta."
+
+#: modules/shortcodes/instagram.php:125
+msgid "Instagram Video"
+msgstr "Instagram-video"
+
+#: modules/shortcodes/instagram.php:118
+msgid "Instagram Photo"
+msgstr "Instagram-foto"
+
+#. translators: Placeholder is a Jetpack logo.
+#: class.jetpack.php:6652
+msgid "Stats by %s"
+msgstr "Statistik enligt %s"
+
+#: modules/stats.php:1400
+msgid "View all stats"
+msgstr "Visa all statistik"
+
+#: class.jetpack.php:1596
+msgid "Jetpack is not in Development Mode."
+msgstr "Jetpack är inte i utvecklingsläge."
+
+#. translators: %s is a URL
+#: class.jetpack.php:1619
+msgid "In Development Mode:"
+msgstr "I utvecklingsläge:"
+
+#: class.jetpack.php:1600
+msgid "The JETPACK_DEV_DEBUG constant is defined in wp-config.php or elsewhere."
+msgstr "Konstanten JETPACK_DEV_DEBUG definieras i wp-config.php eller någon annanstans."
+
+#: class.jetpack.php:1604
+msgid "The jetpack_development_mode filter is set to true."
+msgstr "Filtret jetpack_development_mode är inställt till sant."
+
+#: class.jetpack.php:1602
+msgid "The site URL lacking a dot (e.g. http://localhost)."
+msgstr "Det finns ingen punkt i URL:en för webbplatsen (t.ex. http://localhost)."
+
+#: modules/widgets/simple-payments.php:309
+msgid "Invalid parameters."
+msgstr "Ogiltiga parametrar."
+
+#: modules/widgets/simple-payments/admin-warning.php:9
+msgid "Your plan doesn't include Simple Payments. Learn more and upgrade."
+msgstr "Enkla betalningar ingår inte i ditt paket. Läs mer och uppgradera."
+
+#: modules/publicize/ui.php:325
+msgid "Update Your Sharing Settings"
+msgstr "Uppdatera dina delningsinställningar"
+
+#: modules/publicize/publicize-jetpack.php:537
+msgid "Create a Facebook page to get started."
+msgstr "Skapa en sida på Facebook för att komma igång."
+
+#: modules/publicize/publicize-jetpack.php:492
+msgid "Facebook supports Publicize connections to Facebook Pages, but not to Facebook Profiles. Learn More about Publicize for Facebook"
+msgstr "Facebook stöder Offentliggör-anslutningar till Facebook-sidor, men inte till Facebook-profiler. Läs mer om Offentliggör för Facebook"
+
+#: class.jetpack-cli.php:2013
+msgctxt "\"yes\" is a command - do not translate."
+msgid "Are you sure? This cannot be undone. Type \"yes\" to continue:"
+msgstr "Är du säker? Detta kan inte göras ogjort. Skriv ”ja” för att fortsätta:"
+
+#: class.jetpack-cli.php:2015
+msgctxt "\"yes\" is a command - do not translate."
+msgid "Are you sure? Modifying this option may disrupt your Jetpack connection. Type \"yes\" to continue."
+msgstr "Är du säker? Modifiering av detta alternativ kan störa din anslutning till Jetpack. Skriv ”ja” för att fortsätta."
+
+#: modules/widgets/twitter-timeline.php:113
+msgid "As of July 27, 2018, the Twitter Timeline widget will no longer display tweets based on searches or hashtags. To display a simple list of tweets instead, change the Widget ID to a Twitter username."
+msgstr "Från 27 juli 2018 kommer Twitter Timeline widget inte längre att visa twitter-meddelanden som baseras på sökningar eller hash-taggar. Ändra widgetens ID till ett användarnamn på Twitter för att visa en enkel lista med twittermeddelanden istället."
+
+#: modules/widgets/twitter-timeline.php:94
+#: modules/widgets/twitter-timeline.php:114
+msgid "(Only administrators will see this message.)"
+msgstr "(Endast administratörer kommer att se detta meddelande.)"
+
+#: modules/widgets/twitter-timeline.php:93
+msgid "The Twitter Timeline widget can't display tweets based on searches or hashtags. To display a simple list of tweets instead, change the Widget ID to a Twitter username. Otherwise, delete this widget."
+msgstr "Widgeten Twitter Timeline kan inte visa twittermeddelanden baserat på sökningar eller hash-taggar. Ändra widgetens ID till ett användarnamn på Twitter för att visa en enkel lista med twittermeddelanden istället. I annat fall bör denna widget raderas."
+
+#: modules/widgets/simple-payments.php:328 _inc/blocks/editor-beta.js:24
+#: _inc/blocks/editor.js:24
+msgid "We want to make sure payments reach you, so please add an email address."
+msgstr "Vi vill se till att betalningar når dig, så lägg till en e-postadress."
+
+#: modules/widgets/simple-payments.php:317
+msgid "Everything comes with a price tag these days. Please add a your product price."
+msgstr "Allt har en prislapp nuförtiden. Lägg till ditt produktpris."
+
+#: modules/widgets/simple-payments.php:313
+msgid "People need to know what they're paying for! Please add a brief title."
+msgstr "Folk måste får veta vad de betalar för! Lägg till en kort rubrik."
+
+#: modules/widgets/simple-payments.php:144
+msgid "Are you sure you want to delete this item? It will be disabled and removed from all locations where it currently appears."
+msgstr "Är du säker på att du vill radera detta objekt? Det kommer att inaktiveras och tas bort från alla platser där det visas för tillfället."
+
+#: modules/widgets/simple-payments/form.php:177
+msgid "Delete Product"
+msgstr "Ta bort produkt"
+
+#: modules/widgets/simple-payments/form.php:92
+msgid "Product image"
+msgstr "Produktbild"
+
+#: modules/widgets/simple-payments/form.php:94
+msgid "Select an image"
+msgstr "Välj en bild"
+
+#: modules/widgets/simple-payments/form.php:98
+msgid "Remove image"
+msgstr "Ta bort bild"
+
+#: modules/widgets/simple-payments/form.php:78
+msgid "What is this payment for?"
+msgstr "Vad är denna betalning för?"
+
+#: modules/widgets/simple-payments/form.php:42
+msgid "Edit Selected"
+msgstr "Redigera vald"
+
+#: _inc/lib/admin-pages/class.jetpack-admin-page.php:402
+msgctxt "Navigation item"
+msgid "Terms"
+msgstr "Termer"
+
+#: _inc/lib/admin-pages/class.jetpack-admin-page.php:410
+msgctxt "Navigation item"
+msgid "Privacy"
+msgstr "Integritet"
+
+#: _inc/lib/admin-pages/class.jetpack-admin-page.php:449
+msgctxt "Navigation item"
+msgid "Debug"
+msgstr "Felsök"
+
+#: modules/widgets/eu-cookie-law/form.php:242
+msgid "Position"
+msgstr "Position"
+
+#: modules/widgets/eu-cookie-law/form.php:253
+msgid "Bottom"
+msgstr "Nederkant"
+
+#: modules/widgets/eu-cookie-law/form.php:264
+msgid "Top"
+msgstr "Övre kant"
+
+#: modules/widgets/simple-payments.php:65
+msgid "Simple Payments"
+msgstr "Enkla betalningar"
+
+#. Translators: placeholder is a link to the customizer.
+#: modules/widgets/simple-payments/form.php:194
+msgid "This widget adds a payment button of your choice to your sidebar. To create or edit the payment buttons themselves, use the Customizer."
+msgstr "Den här widgeten lägger till valfri betalningsknapp i ditt sidofält. För att skapa eller redigera betalningsknapparna, använd Anpassa."
+
+#: modules/widgets/simple-payments/form.php:142
+msgid "Allow people to buy more than one item at a time."
+msgstr "Låt folk köpa mer än en sak åt gången."
+
+#: modules/widgets/simple-payments/form.php:88
+msgid "For example: event tickets, charitable donations, training courses, coaching fees, etc."
+msgstr "Till exempel: biljetter till evenemang, donation, utbildning, coachingavgifter, osv."
+
+#: modules/widgets/simple-payments/form.php:37
+msgid "Looks like you don't have any products. You can create one using the Add New button below."
+msgstr "Du verkar inte ha några produkter. Du kan skapa en med hjälp av knappen Lägg till ny nedan"
+
+#: modules/widgets/simple-payments/form.php:11
+msgid "Widget Title"
+msgstr "Widgettitel"
+
+#: modules/sso/class.jetpack-sso-notices.php:22
+msgid "Two-Step Authentication is required to access this site. Please visit your Security Settings to configure Two-step Authentication for your account."
+msgstr "Tvåstegs-autentisering krävs för åtkomst till denna webbplats. Gå till dina Säkerhetsinställningar för att konfigurera Tvåstegs-autentisering för ditt konto."
+
+#: modules/widgets/simple-payments/form.php:22
+msgid "Select a Simple Payments Button:"
+msgstr "Välj en enkel betalningsknapp:"
+
+#: modules/widgets/simple-payments.php:68
+msgid "Add a Simple Payments Button as a Widget."
+msgstr "Lägg till en enkel betalningsknapp som en widget."
+
+#. Translators: placeholders are a link to Paypal website and a target
+#. attribute.
+#: modules/widgets/simple-payments/form.php:160
+msgid "This is where PayPal will send your money. To claim a payment, you'll need a PayPal account connected to a bank account."
+msgstr "Det är hit som PayPal skickar dina pengar. För att ta emot en betalning, behöver du ett PayPal-konto som är kopplat till ett bankkonto."
+
+#: _inc/lib/admin-pages/class.jetpack-admin-page.php:448
+msgid "Test your site's compatibility with Jetpack"
+msgstr "Testa din webbplats kompatibilitet med Jetpack"
+
+#: modules/sitemaps/sitemap-stylist.php:592
+msgid "This is an XML News Sitemap generated by Jetpack, meant to be consumed by search engines like Google or Bing."
+msgstr "Det här är en webbplatskarta för XML-nyheter skapad av Jetpack, avsedd att användas av sökmotorer som Google eller Bing."
+
+#: modules/sitemaps/sitemap-stylist.php:452
+msgid "This is an XML Video Sitemap generated by Jetpack, meant to be consumed by search engines like Google or Bing."
+msgstr "Detta är en webbplatskarta för XML-video skapad av Jetpack, avsedd att användas av sökmotorer som Google eller Bing."
+
+#: modules/sitemaps/sitemap-stylist.php:312
+msgid "This is an XML Image Sitemap generated by Jetpack, meant to be consumed by search engines like Google or Bing."
+msgstr "Detta är en webbplatskarta för XML-bilder skapad av Jetpack, avsedd att användas av sökmotorer som Google eller Bing."
+
+#: modules/sitemaps/sitemap-stylist.php:184
+msgid "This is an XML Sitemap Index generated by Jetpack, meant to be consumed by search engines like Google or Bing."
+msgstr "Detta är ett index för XML-webbplatskarta skapad av Jetpack, avsedd att användas av sökmotorer som Google eller Bing."
+
+#: modules/sitemaps/sitemap-stylist.php:94
+#: modules/sitemaps/sitemap-stylist.php:214
+#: modules/sitemaps/sitemap-stylist.php:334
+#: modules/sitemaps/sitemap-stylist.php:474
+#: modules/sitemaps/sitemap-stylist.php:614
+msgid "Generated by Jetpack for WordPress"
+msgstr "Skapad av Jetpack för WordPress"
+
+#: modules/sitemaps/sitemap-stylist.php:84
+#: modules/sitemaps/sitemap-stylist.php:204
+#: modules/sitemaps/sitemap-stylist.php:324
+#: modules/sitemaps/sitemap-stylist.php:464
+#: modules/sitemaps/sitemap-stylist.php:604
+msgid "You can find more information on XML sitemaps at sitemaps.org"
+msgstr "Du kan hitta mer information om XML-webbplatskartor på sitemaps.org"
+
+#: modules/sitemaps/sitemap-stylist.php:72
+msgid "This is an XML Sitemap generated by Jetpack, meant to be consumed by search engines like Google or Bing."
+msgstr "Detta är en XML-webbplatskarta skapad av Jetpack, avsedd att användas av sökmotorer som Google eller Bing."
+
+#: modules/shortcodes/wordads.php:70
+msgid "The WordAds module is not active"
+msgstr "Modulen WordAds är inte aktiv"
+
+#: modules/simple-payments/simple-payments.php:467
+msgctxt "noun: a quantity of goods or items purchased or sold"
+msgid "Order"
+msgstr "Beställning"
+
+#: modules/related-posts/class.related-posts-customize.php:218
+msgid "Show a thumbnail image where available."
+msgstr "Visa miniatyrbild om det finns en."
+
+#: modules/sharedaddy/recaptcha.php:64
+msgid "Unexpected hostname"
+msgstr "Oväntat servernamn."
+
+#. translators: Variables are the enclosing link to the settings page
+#: modules/infinite-scroll/infinity.php:395
+msgid "This option has moved. You can now manage it %1$shere%2$s."
+msgstr "Detta val har flyttat. Nu kan du kontrollera det %1$shär%2$s."
+
+#. translators: %1$s is replaced with an input field for numbers.
+#: modules/custom-css/custom-css.php:1058
+msgid "Limit width to %1$s pixels for full size images. (More info.)"
+msgstr "Begränsa bredden till %1$s pixlar för bilder i originalstorlek. (Mer info.)"
+
+#: modules/carousel/jetpack-carousel.php:796
+msgid "Show photo metadata (Exif) in carousel, when available."
+msgstr "Visa metadata för bild (Exif) i karusellvisningen när de är tillgängliga."
+
+#: class.jetpack-connection-banner.php:349
+msgid "Security & Backups"
+msgstr "Säkerhet och säkerhetskopiering"
+
+#: class.jetpack-connection-banner.php:391
+msgctxt "a link that closes the modal window that offers to connect Jetpack"
+msgid "Not now, thank you."
+msgstr "Inte nu, tack."
+
+#: _inc/lib/class.core-rest-api-endpoints.php:1236
+msgid "New owner is not admin"
+msgstr "Den nya ägaren saknar administrationsbehörighet"
+
+#: _inc/lib/class.core-rest-api-endpoints.php:1244
+msgid "New owner is same as current user"
+msgstr "Den nya ägaren är samma som nuvarande användare"
+
+#: _inc/lib/class.core-rest-api-endpoints.php:1252
+msgid "New owner is not connected"
+msgstr "Den nya ägaren är inte ansluten"
+
+#: _inc/lib/class.core-rest-api-endpoints.php:1284
+msgid "Could not confirm new owner."
+msgstr "Det gick inte att bekräfta den nya ägaren."
+
+#: class.jetpack-cli.php:64
+msgid "Jetpack connection is broken."
+msgstr "Jetpack-anslutningen fungerar inte."
+
+#: class.jetpack-cli.php:1702
+msgid "A connection ID must be passed in order to disconnect."
+msgstr "För frånkoppling måste ett anslutnings-ID skickas med."
+
+#: class.jetpack-cli.php:1709
+msgid "You're about to delete all publicize connections."
+msgstr "Du är på väg att radera alla förbindelser för ”offentliggör”."
+
+#. translators: %s is a lowercase string for a social network.
+#: class.jetpack-cli.php:1712
+msgid "You're about to delete all publicize connections to %s."
+msgstr "Du är på väg att radera alla förbindelser för ”offentliggör” till %s."
+
+#. translators: %s is a lowercase string for a social network.
+#: class.jetpack-cli.php:1738
+msgid "Disconnecting all connections to %s."
+msgstr "Kopplar ifrån alla förbindelser till %s."
+
+#. translators: %1$d is a numeric ID and %2$s is a lowercase string for a
+#. social network.
+#: class.jetpack-cli.php:1747
+msgid "Publicize connection %d could not be disconnected"
+msgstr "Offentliggör-anslutningen %d kunde inte kopplas ifrån"
+
+#: class.jetpack-cli.php:1759
+msgid "All publicize connections were successfully disconnected."
+msgstr "Alla ”offentliggör”-anslutingar har kopplats ifrån."
+
+#. translators: %s is a lowercase string for a social network.
+#: class.jetpack-cli.php:1762
+msgid "All publicize connections to %s were successfully disconnected."
+msgstr "Alla ”offentliggör”-anslutingar till %s har kopplats ifrån."
+
+#. translators: %d is a numeric ID. Example: 1234.
+#: class.jetpack-cli.php:1768
+msgid "Publicize connection %d has been disconnected."
+msgstr "”Offentliggör”-anslutingen %d har kopplats ifrån."
+
+#. translators: %d is a numeric ID. Example: 1234.
+#: class.jetpack-cli.php:1771
+msgid "Publicize connection %d could not be disconnected."
+msgstr "”Offentliggör”-anslutingen %d kunde inte kopplas ifrån."
+
+#: _inc/jetpack-strings.php:696
+msgid "Privacy information"
+msgstr "Integritetsinformation"
+
+#: _inc/jetpack-strings.php:303
+msgid "Enable Lazy Loading for images"
+msgstr "Aktivera ”Lazy Load” för bilder"
+
+#: _inc/jetpack-strings.php:302
+msgid "Lazy-loading images will improve your site’s speed and create a smoother viewing experience. Images will load as visitors scroll down the screen, instead of all at once."
+msgstr "”Lazy load” av bilder snabbar upp din webbplats och skapar en jämnare visningsupplevelse. Bilder laddas in allteftersom besökaren bläddrar nedåt på skärmen, istället för alla på en gång."
+
+#: _inc/jetpack-strings.php:297
+msgid "Performance & speed"
+msgstr "Prestanda och hastighet"
+
+#: _inc/jetpack-strings.php:283
+msgid "Enable high-speed, ad-free video player"
+msgstr "Aktivera snabb, reklamfri videospelare"
+
+#: _inc/jetpack-strings.php:282
+msgid "Make the content you publish more engaging with high-resolution video. With Jetpack Video you can customize your media player and deliver high-speed, ad-free, and unbranded videos to your visitors. Videos are hosted on our WordPress.com servers and do not subtract space from your hosting plan!"
+msgstr "Gör innehållet du publicerar mer engagerande med högupplöst video. Med Jetpack Video kan du anpassa din mediaspelare och leverera snabba, reklamfria och varumärkesfria videor till dina besökare. Videor lagras på våra WordPress.com-servrar och upptar inte något utrymme på ditt webbhotell!"
+
+#: _inc/jetpack-strings.php:281
+msgid "Video"
+msgstr "Video"
+
+#: _inc/jetpack-strings.php:538
+msgid "Carousel color scheme"
+msgstr "Karusellfärgschema"
+
+#: _inc/jetpack-strings.php:537
+msgid "Exif data shows viewers additional technical details of a photo, like its focal length, aperture, and ISO."
+msgstr "Exif-data visar besökare ytterligare tekniska detaljer för en bild, såsom brännvidd, bländare och ISO."
+
+#: _inc/jetpack-strings.php:536
+msgid "Show photo Exif metadata in carousel (when available)"
+msgstr "Visa Exif-metadata för bild i karusellvisning (när de är tillgängliga)"
+
+#: _inc/jetpack-strings.php:535
+msgid "Display images in a full-screen carousel gallery"
+msgstr "Visa bilder i ett karusellgalleri i fullskärm."
+
+#: _inc/jetpack-strings.php:534
+msgid "Create full-screen carousel slideshows for the images in your posts and pages. Carousel galleries are mobile-friendly and encourage site visitors to interact with your photos."
+msgstr "Skapa karusellbildspel i fullskärm för bilderna i dina inlägg och på dina sidor. Karusellgallerier är mobilvänliga och uppmanar webbplatsbesökare att interagera med dina bilder."
+
+#: _inc/jetpack-strings.php:494
+msgid "Portfolios shortcode: [portfolio]"
+msgstr "Portfolio-kortkod: [portfolio]"
+
+#: _inc/jetpack-strings.php:492
+msgid "Use {{portfolioLink}}portfolios{{/portfolioLink}} on your site to showcase your best work. If your theme doesn’t support Jetpack Portfolios, you can still use a simple shortcode to display them on your site."
+msgstr "Använd {{portfolioLink}}portfolior{{/portfolioLink}} på din webbplats för att visa upp ditt bästa arbete. Om ditt tema inte har stöd för Jetpack-portfolior kan du ändå visa dem på din webbplats med hjälp av en enkel kortkod."
+
+#: _inc/jetpack-strings.php:490
+msgid "Testimonials shortcode: [testimonials]"
+msgstr "Kortkod för omdömen: [testimonials]"
+
+#: _inc/jetpack-strings.php:488
+msgid "Add {{testimonialLink}}testimonials{{/testimonialLink}} to your website to attract new customers. If your theme doesn’t support Jetpack Testimonials, you can still use a simple shortcode to display them on your site."
+msgstr "Lägg till {{testimonialLink}}omdömen{{/testimonialLink}} på din webbplats för att locka nya kunder. Om ditt tema inte har stöd för Jetpack-omdömen kan du ändå visa dem på din webbplats med hjälp av en enkel kortkod."
+
+#: _inc/jetpack-strings.php:474
+msgid "Search engines can't access your site at the moment. If you'd like to make your site accessible, check your {{a}}Reading settings{{/a}} and switch \"Search Engine Visibility\" on."
+msgstr "Sökmotorer kan inte komma åt din webbplats för tillfället. Om du vill göra din webbplats tillgänglig, kontrollera dina {{a}}inställningar för Läsaren{{/a}} och slå på ”Synlighet i sökmotorer”."
+
+#: _inc/jetpack-strings.php:473
+msgid "Good news: Jetpack is sending your sitemap automatically to all major search engines for indexing."
+msgstr "Goda nyheter: Jetpack skickar automatiskt din webbplatskarta till alla större sökmotorer för indexering."
+
+#: _inc/jetpack-strings.php:471
+msgid "Sitemaps are files that search engines like Google or Bing use to index your website. They can help improve your ranking in search results. When you enable this feature, Jetpack will create sitemaps for you and update them automatically when the content on your site changes."
+msgstr "Webbplatskartor är filer som sökmotorer som Google eller Bing använder för att indexera din webbplats. De kan hjälpa till att förbättra din rankning i sökresultat. När du aktiverar den här funktionen skapar Jetpack webbplatskartor åt dig och uppdaterar dem automatiskt när innehållet på din webbplats ändras."
+
+#: _inc/jetpack-strings.php:440 _inc/jetpack-strings.php:653
+#: _inc/lib/class.core-rest-api-endpoints.php:2020
+#: modules/related-posts/jetpack-related-posts.php:601
+msgid "Show a thumbnail image where available"
+msgstr "Visa miniatyrbilder om de finns"
+
+#: _inc/jetpack-strings.php:452
+msgid "Configure related posts in the Customizer"
+msgstr "Konfigurera relaterade inlägg i Anpassa"
+
+#: _inc/jetpack-strings.php:439 _inc/jetpack-strings.php:652
+#: _inc/lib/class.core-rest-api-endpoints.php:2013
+#: modules/related-posts/jetpack-related-posts.php:599
+msgid "Highlight related content with a heading"
+msgstr "Framhåll relaterat innehåll med en rubrik"
+
+#: _inc/jetpack-strings.php:153
+msgid "View security scan details"
+msgstr "Visa säkerhetsskanningsdetaljer"
+
+#: modules/widgets/eu-cookie-law.php:135
+msgid ""
+"Privacy & Cookies: This site uses cookies. By continuing to use this website, you agree to their use. \n"
+"To find out more, including how to control cookies, see here:"
+msgstr ""
+"Integritet och cookies: Den här webbplatsen använder cookies. Genom att fortsätta använda den här webbplatsen godkänner du deras användning. \n"
+"Om du vill veta mer, inklusive hur du kontrollerar cookies, se:"
+
+#: modules/widgets/eu-cookie-law.php:133
+msgid "Cookie Policy"
+msgstr "Cookie-policy"
+
+#: modules/widgets/eu-cookie-law.php:86
+msgid "Display a banner for EU Cookie Law and GDPR compliance."
+msgstr "Visa en banner om efterföljande av EU:s cookie-lagstiftning och GDPR."
+
+#: modules/widgets/eu-cookie-law.php:84
+msgid "Cookies & Consents Banner"
+msgstr "Banner om cookies och samtycke"
+
+#: modules/widgets/eu-cookie-law/form.php:189
+msgctxt "action"
+msgid "Consent expires after"
+msgstr "Samtycket upphör efter"
+
+#: modules/widgets/eu-cookie-law/form.php:179
+msgid "Visitors must provide consent by clicking the dismiss button when Jetpack Ads is turned on."
+msgstr "Besökare måste medge samtycke genom att klicka på avvisningsknappen när Jetpack Ads slås på."
+
+#: modules/widgets/eu-cookie-law/form.php:127
+msgctxt "action"
+msgid "Capture consent & hide the banner"
+msgstr "Infånga samtycke och göm banner"
+
+#: modules/widgets/eu-cookie-law/form.php:95
+msgid "Link text"
+msgstr "Länktext"
+
+#: modules/widgets/eu-cookie-law/form.php:83
+msgid "For GDPR compliance, please make sure your policy contains privacy information relating to Jetpack Ads."
+msgstr "För GDPR-överensstämmelse se till att din policy innehåller integritetsinformation gällande Jetpack Ads."
+
+#: modules/widgets/eu-cookie-law/form.php:75
+msgid "The default policy URL only covers cookies set by Jetpack. If you’re running other plugins, custom cookies, or third-party tracking technologies, you should create and link to your own cookie statement."
+msgstr "Standardpolicy-URL omfattar endast cookies som angetts av Jetpack. Om du kör andra tillägg, anpassade cookies eller spårningsteknik från tredje part ska du skapa och länka detta till ditt eget cookie-meddelande."
+
+#: modules/widgets/eu-cookie-law/form.php:74
+#: modules/widgets/eu-cookie-law/form.php:81
+msgid "Caution:"
+msgstr "Varning:"
+
+#: modules/widgets/eu-cookie-law/form.php:62
+msgid "Custom URL:"
+msgstr "Anpassad URL:"
+
+#: modules/widgets/eu-cookie-law/form.php:40
+msgid "Privacy Policy Link"
+msgstr "Länk till sekretesspolicy"
+
+#. translators: %d: Post ID.
+#: modules/contact-form/grunion-contact-form.php:1071
+#: modules/contact-form/grunion-contact-form.php:1087
+msgid "Feedback ID %d could not be removed at this time."
+msgstr "Feedback-ID %d kunde inte tas bort just nu."
+
+#. translators: %1$s is an endpoint route (ex. /sites/123456), %2$d is an HTTP
+#. status code.
+#: class.jetpack-cli.php:1371
+msgid "Request to %1$s returned a non-200 response code: %2$d."
+msgstr "Begäran att %1$s returnerade en icke-200-svarskod: %2$d."
+
+#. translators: %1$s is an endpoint route (ex. /sites/123456), %2$d is an error
+#. code, %3$s is an error message.
+#: class.jetpack-cli.php:1359
+msgid "Request to %1$s returned an error: (%2$d) %3$s."
+msgstr "Begäran att %1$s returnerade ett fel: (%2$d) %3$s."
+
+#: _inc/jetpack-strings.php:324
+msgid "For more information on how specific Jetpack features use data and track activity, please refer to our {{privacyCenterLink}}Privacy Center{{/privacyCenterLink}}."
+msgstr "För mer information om hur specifika Jetpack-funktioner använder data- och spårningsaktiviteter se vårt {{privacyCenterLink}}Integritetscenter{{/privacyCenterLink}}."
+
+#: _inc/jetpack-strings.php:323
+msgid "We use other tracking tools, including some from third parties. {{cookiePolicyLink}}Read about these{{/cookiePolicyLink}} and how to control them."
+msgstr "Vi använder andra spårningsverktyg, inklusive några från tredje part. {{cookiePolicyLink}}Läs om dessa{{/cookiePolicyLink}} och hur man kontrollerar dem."
+
+#: _inc/jetpack-strings.php:322
+msgid "This information helps us improve our products, make marketing to you more relevant, personalize your WordPress.com experience, and more as detailed in our {{pp}}privacy policy{{/pp}}."
+msgstr "Denna information hjälper oss att förbättra våra produkter, göra vår marknadsföring gentemot dig mer relevant, anpassa din WordPress.com-upplevelse och mycket mer, enligt vår {{pp}}sekretesspolicy{{/pp}}."
+
+#: _inc/jetpack-strings.php:321
+msgid "Share information with our analytics tool about your use of services while logged in to your WordPress.com account. {{cookiePolicyLink}}Learn more{{/cookiePolicyLink}}."
+msgstr "Dela information med våra analysverktyg om din användning av tjänster när du är inloggad på ditt WordPress.com-konto. {{cookiePolicyLink}}Läs mer{{/cookiePolicyLink}}."
+
+#: modules/widgets/social-media-icons.php:48
+msgid "Social Media Icons (Deprecated)"
+msgstr "Ikoner för sociala medier (borttagna)"
+
+#: modules/widgets/social-icons.php:525
+msgid "RSS Feed"
+msgstr "RSS-flöde"
+
+#: modules/widgets/social-icons.php:345
+msgid "Account URL"
+msgstr "Konto-URL"
+
+#: modules/widgets/social-icons.php:314
+msgid "Open link in a new tab"
+msgstr "Öppna länken i en ny flik"
+
+#: modules/widgets/social-icons.php:308
+msgid "View available icons"
+msgstr "Visa tillgängliga ikoner"
+
+#: modules/widgets/social-icons.php:287
+msgid "Add an icon"
+msgstr "Lägg till en ikon"
+
+#: modules/widgets/social-icons.php:258
+msgid "Size:"
+msgstr "Storlek:"
+
+#: modules/widgets/social-icons.php:34
+msgid "Follow Us"
+msgstr "Följ oss"
+
+#: modules/widgets/social-icons.php:29
+msgid "Social Icons"
+msgstr "Sociala ikoner"
+
+#: modules/widgets/social-icons.php:22
+msgid "Add social-media icons to your site."
+msgstr "Lägg till sociala media-ikoner på din webbplats."
+
+#. translators: Service name is %1$s, and account name is %2$s.
+#: modules/publicize/publicize.php:1086
+msgid "%1$s (%2$s)"
+msgstr "%1$s (%2$s)"
+
+#: modules/sharedaddy/sharing-sources.php:1757
+msgid "Click to share on Skype"
+msgstr "Klicka för att dela på Skype"
+
+#. translators: Message shown after a post is published
+#: modules/subscriptions.php:191
+msgid "Post published and sending emails to subscribers."
+msgstr "Inlägg publicerat och skickar e-post till alla prenumeranter."
+
+#. translators: %1$s is a comma-separated list of services and accounts. Ex.
+#. Facebook (@jetpack), Twitter (@jetpack)
+#: modules/publicize/publicize.php:1094
+msgid "Post published and sharing on %1$s."
+msgstr "Inlägg publicerat och delar på %1$s"
+
+#. translators: %1$s is a comma-separated list of services and accounts. Ex.
+#. Facebook (@jetpack), Twitter (@jetpack)
+#: modules/publicize/publicize.php:1103
+msgid "Post published, sending emails to subscribers and sharing post on %1$s."
+msgstr "Inlägg publicerat, skickar e-post till alla prenumeranter och delar inlägg på %1$s."
+
+#. translators: %1$s is a comma-separated list of services and accounts. Ex.
+#. Facebook (@jetpack), Twitter (@jetpack)
+#: modules/publicize/publicize.php:1111
+msgid "Project published and sharing project on %1$s."
+msgstr "Projekt publicerat och delar projekt på %1$s."
+
+#: modules/subscriptions.php:186 modules/publicize/publicize.php:1065
+msgid "View post"
+msgstr "Visa inlägg"
+
+#: modules/publicize/publicize.php:1068
+msgid "View project"
+msgstr "Visa projekt"
+
+#: modules/subscriptions/views.php:148
+msgid "You have already subscribed to this site. Please check your inbox. You can manage your preferences at subscribe.wordpress.com"
+msgstr "Du prenumererar redan på den här webbplatsen. Kontrollera din inkorg. Du kan hantera dina alternativ på subscribe.wordpress.com"
+
+#: json-endpoints/class.wpcom-json-api-render-embed-endpoint.php:63
+msgid "The requested URL is not an embed."
+msgstr "Begärd URL är inte inbäddad."
+
+#: json-endpoints/class.wpcom-json-api-render-embed-endpoint.php:48
+msgid "Only one embed can be rendered at a time."
+msgstr "Endast en inbäddning kan renderas åt gången."
+
+#: json-endpoints/class.wpcom-json-api-render-embed-endpoint.php:44
+#: json-endpoints/class.wpcom-json-api-render-embed-endpoint.php:54
+msgid "The embed_url parameter must be a valid URL."
+msgstr "Parametern embed_url måste vara en giltig URL."
+
+#: json-endpoints/class.wpcom-json-api-render-embed-endpoint.php:36
+msgid "Your token must have permission to post on this blog."
+msgstr "Din token måste ha behörighet att publicera på denna blogg."
+
+#. translators: %s is the name of a custom post type
+#: modules/infinite-scroll/infinity.php:834
+msgid "More %s"
+msgstr "Mer %s"
+
+#: modules/comments/comments.php:337
+msgid "Comment Form"
+msgstr "Kommentarsformulär"
+
+#: class.jetpack-cli.php:1262
+msgid "A non-empty token argument must be passed."
+msgstr "Ett token-argument som inte är tomt måste skickas."
+
+#. translators: %d is a user ID
+#: class.jetpack-cli.php:1284
+msgid "Authorized %d and activated default modules."
+msgstr "Auktoriserade %d och aktiverade standardmoduler."
+
+#. translators: %d is a user ID
+#: class.jetpack-cli.php:1287
+msgid "Authorized %d."
+msgstr "Auktoriserade %d."
+
+#: class.jetpack-cli.php:1258
+msgid "Please select a user to authorize via the --user global argument."
+msgstr "Välj en användare att auktorisera via argumentet --user global."
+
+#: class.jetpack.php:4105
+msgid "Could not activate %s"
+msgstr "Kunde inte aktivera %s"
+
+#. translators: %s is the name of a Jetpack module
+#: class.jetpack-cli.php:534
+msgid "%s could not be activated."
+msgstr "%s kunde inte aktiveras."
+
+#: _inc/lib/core-api/class.jetpack-core-api-module-endpoints.php:73
+msgid "The requested Jetpack module is not supported by your plan."
+msgstr "Den begärda Jetpack-modulen har inte stöd av ditt paket."
+
+#: _inc/jetpack-strings.php:661
+msgid "This feature has been disabled by a site administrator. {{link}}Learn more{{/link}}."
+msgstr "Den här funktionen har inaktiverats av en administratör. {{link}}Läs mer{{/link}}."
+
+#: _inc/jetpack-strings.php:662
+msgid "This feature is being managed by a site administrator. {{link}}Learn more{{/link}}."
+msgstr "Den här funktionen hanteras av en administratör. {{link}}Läs mer{{/link}}."
+
+#: _inc/jetpack-strings.php:640
+msgid "%(moduleName)s has been disabled by a site administrator. {{link}}Learn more{{/link}}."
+msgstr "%(moduleName) har inaktiverats av en administratör. {{link}}Läs mer{{/link}}."
+
+#: _inc/jetpack-strings.php:660
+msgid "This feature has been enabled by a site administrator. {{link}}Learn more{{/link}}."
+msgstr "Den här funktionen har aktiverats av en administratör. {{link}}Läs mer{{/link}}."
+
+#: _inc/jetpack-strings.php:318
+msgctxt "Search term."
+msgid "terms of service"
+msgstr "användarvillkor"
+
+#: _inc/jetpack-strings.php:317
+msgctxt "Search term."
+msgid "tos"
+msgstr "tos"
+
+#: _inc/jetpack-strings.php:316
+msgctxt "Search term."
+msgid "gdpr"
+msgstr "gdpr"
+
+#: _inc/jetpack-strings.php:315
+msgctxt "Search term."
+msgid "data"
+msgstr "data"
+
+#: _inc/jetpack-strings.php:314
+msgctxt "Search term."
+msgid "tracks"
+msgstr "spårning"
+
+#: _inc/jetpack-strings.php:313
+msgctxt "Search term."
+msgid "privacy"
+msgstr "integritet"
+
+#: _inc/jetpack-strings.php:522
+msgid "Enables a lightweight, mobile-friendly theme that will be displayed to visitors on mobile devices."
+msgstr "Aktiverar ett mobilvänligt tema som väger lite och som kommer att visas för besökare på mobila enheter."
+
+#: _inc/jetpack-strings.php:514
+msgid "Loads the next posts automatically when the reader approaches the bottom of the page."
+msgstr "Laddar nästa inlägg automatiskt när läsaren närmar sig slutet på sidan."
+
+#: _inc/jetpack-strings.php:504
+msgid "Allows you to publish new posts by sending an email to a special address."
+msgstr "Gör att du kan publicera nya inlägg genom att skicka ett e-postmeddelande till en särskild adress."
+
+#: _inc/jetpack-strings.php:500
+msgid "Adds a toolbar with links to all your sites, notifications, your WordPress.com profile, and the Reader."
+msgstr "Lägger till ett verktygsfält med länkar till alla dina webbplatser, meddelanden, din WordPress.com-profil och Läsaren."
+
+#: _inc/jetpack-strings.php:320
+msgid "We are committed to your privacy and security. "
+msgstr "Vi är engagerade i din integritet och säkerhet. "
+
+#: _inc/jetpack-strings.php:319
+msgctxt "Settings header"
+msgid "Privacy Settings"
+msgstr "Integritetsinställningar"
+
+#: _inc/jetpack-strings.php:376
+msgctxt "Settings header"
+msgid "Downtime monitoring"
+msgstr "Driftstoppsövervakning"
+
+#: _inc/jetpack-strings.php:475
+msgid "%(moduleName)s has been disabled by a site administrator."
+msgstr "%(moduleName) har inaktiverats av en administratör."
+
+#: _inc/jetpack-strings.php:379
+msgid "Configure your notification settings"
+msgstr "Konfigurera dina notisinställningar"
+
+#: _inc/jetpack-strings.php:487
+msgid "This feature has been disabled by a site administrator."
+msgstr "Den här funktionen har inaktiverats av en administratör."
+
+#: _inc/jetpack-strings.php:425
+msgid "You can place additional ads using the Ad widget. {{link}}Try it out!{{/link}}"
+msgstr "Du kan lägga till ytterligare annonser med Ad-widgeten. {{link}}Prova det!{{/link}}"
+
+#: _inc/jetpack-strings.php:476
+msgid "Provides the necessary hidden tags needed to verify your WordPress site with various services."
+msgstr "Tillhandahåller de nödvändiga, dolda taggar som behövs för att verifiera din WordPress-webbplats med olika tjänster."
+
+#: _inc/jetpack-strings.php:465
+msgid "Displays information on your site activity, including visitors and popular posts or pages."
+msgstr "Visar information om aktiviteten på din webbplats, inklusive besökare och populära inlägg eller sidor."
+
+#: _inc/jetpack-strings.php:454
+msgid "Allows you to optimize your site and its content for better results in search engines."
+msgstr "Gör att du kan optimera din webbplats och dess innehåll för bättre resultat i sökmotorer."
+
+#: _inc/jetpack-strings.php:431
+msgid "Integrates your WordPress site with Google Analytics, a platform that offers insights into your traffic, visitors, and conversions."
+msgstr "Integrerar din WordPress-webbplats med Google Analytics, en plattform som erbjuder insikter om din trafik, besökare och konverteringar."
+
+#: _inc/jetpack-strings.php:413
+msgid "Displays high-quality ads on your site that allow you to earn income."
+msgstr "Visa annonser av hög kvalitet på din webbplats som gör att du kan skapa intäkter."
+
+#: _inc/jetpack-strings.php:402
+msgid "Allows you to automatically share your newest content on social media sites, including Facebook and Twitter."
+msgstr "Gör så att du automatiskt kan dela ditt senaste innehåll på sociala medier, inklusive Facebook och Twitter."
+
+#: _inc/jetpack-strings.php:396
+msgid "Adds like buttons to your content so that visitors can show their appreciation or enjoyment."
+msgstr "Lägger till gilla-knappar i ditt innehåll så att besökare kan visa sin uppskattning."
+
+#: _inc/jetpack-strings.php:387
+msgid "Allows registered users to log in to your site with their WordPress.com accounts."
+msgstr "Gör så att registrerade användare kan logga in på din webbplats med sina WordPress.com-konton."
+
+#: _inc/jetpack-strings.php:348 _inc/jetpack-strings.php:369
+msgid "Backs up your site to the global WordPress.com servers, allowing you to restore your content in the event of an emergency or error."
+msgstr "Säkerhetskopierar din webbplats till de globala WordPress.com-servrarna, så att du kan återställa innehållet i händelse av en nödsituation eller ett fel."
+
+#: _inc/jetpack-strings.php:344
+msgid "Removes spam from comments and contact forms."
+msgstr "Tar bort skräppost från kommentarer och kontaktformulär."
+
+#: _inc/jetpack-strings.php:163
+msgid "Add Search (Jetpack) Widget"
+msgstr "Lägg till Sökwidget (Jetpack)"
+
+#: _inc/jetpack-strings.php:162
+msgid "Jetpack Search is powering search on your site."
+msgstr "Jetpack Sök förbättrar sökningen på din webbplats."
+
+#: _inc/jetpack-strings.php:156 _inc/jetpack-strings.php:161
+msgid "Jetpack Search is a powerful replacement for the search capability built into WordPress."
+msgstr "Jetpack-sökning är en kraftfull ersättning för sökfunktionen inbyggd i WordPress."
+
+#: _inc/jetpack-strings.php:164
+msgid "{{a}}Activate{{/a}} to replace the WordPress built-in search with Jetpack Search, an advanced search experience."
+msgstr "{{a}}Aktivera{{/a}} för att ersätta WordPress inbyggda sökfunktion med Jetpack Sök, en avancerad sökupplevelse"
+
+#: _inc/jetpack-strings.php:139
+msgid "Your site’s files are regularly scanned for unauthorized or suspicious modifications that could compromise your security and data."
+msgstr "Filerna på din webbplats söks regelbundet igenom efter obehöriga eller misstänksamma ändringar som kan kompromettera din säkerhet och data."
+
+#: _inc/jetpack-strings.php:127
+msgid "%(number)s"
+msgid_plural "%(number)s"
+msgstr[0] "%(number)s"
+msgstr[1] "%(number)s"
+
+#: _inc/jetpack-strings.php:125
+msgid "Jetpack’s Plugin Updates allows you to choose which plugins update automatically."
+msgstr "Jetpacks tillägg Updates låter dig välja vilka tillägg som ska uppdateras automatiskt."
+
+#: _inc/jetpack-strings.php:128
+msgid "Plugin needs updating."
+msgid_plural "Plugins need updating."
+msgstr[0] "Tillägg behöver uppdateras."
+msgstr[1] "Tillägg behöver uppdateras."
+
+#: _inc/jetpack-strings.php:133 _inc/jetpack-strings.php:381
+msgid "Protects your site from traditional and distributed brute force login attacks."
+msgstr "Skyddar din webbplats från traditionella och distribuerade brute force-inloggningsattacker."
+
+#: _inc/jetpack-strings.php:131
+msgid "Manage your plugins"
+msgstr "Hantera dina tillägg"
+
+#: _inc/jetpack-strings.php:120
+msgid "Jetpack will optimize your images and serve them from the server location nearest to your visitors. Using our global content delivery network will boost the loading speed of your site."
+msgstr "Jetpack kommer att optimera dina bilder och leverera dem från den server som finns närmast dina besökare. Användningen av vårt globala nätverk för innehållsdistribution får din webbplats att laddas snabbare."
+
+#: _inc/jetpack-strings.php:115
+msgid "Jetpack’s downtime monitor will continuously monitor your site, and alert you the moment that downtime is detected."
+msgstr "Jetpacks driftstoppsövervakning håller koll på din webbplats och och varnar dig direkt när ett driftstopp upptäcks."
+
+#: _inc/jetpack-strings.php:89
+msgid "Jetpack Backups allow you to easily restore or download a backup from a specific moment."
+msgstr "Jetpack Backups låter dig enkelt återställa eller ladda ner en säkerhetskopia från ett specifikt tillfälle."
+
+#: _inc/jetpack-strings.php:307
+msgid "View all Jetpack plans"
+msgstr "Visa alla Jetpack-paket"
+
+#: _inc/jetpack-strings.php:306
+msgid "Manage your plan"
+msgstr "Hantera ditt paket"
+
+#: _inc/jetpack-strings.php:305
+msgid "Your Plan"
+msgstr "Ditt paket"
+
+#: _inc/jetpack-strings.php:304
+msgid "You’re currently on Jetpack %(plan)s."
+msgstr "Du är för närvarande på Jetpack %(plan)s."
+
+#: _inc/jetpack-strings.php:87
+msgid "Moderate comments"
+msgstr "Moderera kommentarer"
+
+#: _inc/jetpack-strings.php:179
+msgid "Allows readers to subscribe to your posts or comments, and receive notifications of new content by email."
+msgstr "Gör att användare kan prenumerera på dina inlägg eller kommentarer och ta emot notiser om nytt innehåll via e-post."
+
+#: _inc/jetpack-strings.php:166
+msgid "Replaces the standard WordPress comment form with a new comment system that includes social media login options."
+msgstr "Ersätter WordPress standardformulär för kommentarer med ett nytt kommentarssystem som innehåller inloggningsalternativ för sociala medier."
+
+#: _inc/jetpack-strings.php:68
+msgid "Error updating privacy settings. %(error)s"
+msgstr "Fel vid uppdatering av integritetsinställningar. %(error)s"
+
+#: _inc/jetpack-strings.php:67
+msgid "Updated privacy settings."
+msgstr "Uppdaterade integritetsinställningar"
+
+#: _inc/jetpack-strings.php:66
+msgid "Updating privacy settings…"
+msgstr "Uppdaterar integritetsinställningar ..."
+
+#: _inc/jetpack-strings.php:290
+msgid "Add Jetpack Search Widget"
+msgstr "Lägg till Jetpack sökwidget"
+
+#: class.jetpack-cli.php:1102
+msgid "Can not cancel a plan while in safe mode. See: https://jetpack.com/support/safe-mode/"
+msgstr "Kan inte avbryta en plan i säkert läge. Se: https://jetpack.com/support/safe-mode/"
+
+#: _inc/jetpack-strings.php:22
+msgid "Daily backups, spam filtering, and priority support."
+msgstr "Daglig säkerhetskopiering, skräppostfiltrering och prioriterad support."
+
+#: modules/module-info.php:816
+msgid "Enhanced analytics for WooCommerce and Jetpack users."
+msgstr "Förbättrad analys för WooCommerce och Jetpack-användare."
+
+#: _inc/jetpack-strings.php:26
+msgid "Full security suite, marketing and revenue automation tools, unlimited video hosting, and priority support."
+msgstr "Fullständigt säkerhetspaket, marknadsförings- och intäktsautomatiseringsverktyg, obegränsat videohotell och prioriterad support."
+
+#: _inc/jetpack-strings.php:29
+msgid "Full security suite, marketing and revenue automation tools, unlimited video hosting, unlimited themes, enhanced search, and priority support."
+msgstr "Fullständigt säkerhetspaket, marknadsförings- och intäktsautomatiseringsverktyg, obegränsat videohotell, obegränsade teman, förbättrad sökning och prioriterad support."
+
+#: modules/widgets/search.php:72
+msgid "Replaces the default search with an Elasticsearch-powered search interface and filters."
+msgstr "Byter ut sökfunktionen som används som standard mot ett Elasticsearch-drivet sökgränssnitt och filter."
+
+#: _inc/jetpack-strings.php:289
+msgid "Add the Jetpack Search widget to your sidebar to configure sorting and filters."
+msgstr "Lägg till Jetpack-sök widget i din sidopanel för att konfigurera sortering och filter."
+
+#: _inc/jetpack-strings.php:248
+msgid "Always-on security"
+msgstr "Ständigt aktiv säkerhet"
+
+#: _inc/class.jetpack-provision.php:45
+msgid "Can not provision a plan while in safe mode. See: https://jetpack.com/support/safe-mode/"
+msgstr "Kan inte tillhandahålla en plan i säkert läge. Se: https://jetpack.com/support/safe-mode/"
+
+#: _inc/jetpack-strings.php:213
+msgid "Activate video hosting"
+msgstr "Aktivera videohotell"
+
+#: modules/widgets/search.php:554
+msgid "Title (optional):"
+msgstr "Rubrik (valfritt)"
+
+#: modules/widgets/search.php:195
+msgid "Oldest first"
+msgstr "Äldsta först"
+
+#: modules/widgets/search.php:194
+msgid "Newest first"
+msgstr "Nyaste först"
+
+#: modules/widgets/search.php:630
+msgid "Add a filter"
+msgstr "Lägg till ett filter"
+
+#: modules/widgets/search.php:802
+msgid "Maximum number of filters (1-50):"
+msgstr "Maximalt antal filter (1-50):"
+
+#. translators: %1$s is the taxonomy name, %2s is the name of its type to help
+#. distinguish between several taxonomies with the same name, e.g. category and
+#. tag.
+#: modules/widgets/search.php:739
+msgctxt "A label for a taxonomy selector option"
+msgid "%1$s (%2$s)"
+msgstr "%1$s (%2$s)"
+
+#: modules/search/class.jetpack-search-helpers.php:204
+msgctxt "label for filtering posts"
+msgid "Month"
+msgstr "Månad"
+
+#: modules/search/class.jetpack-search-helpers.php:225
+msgctxt "label for filtering posts"
+msgid "Post Types"
+msgstr "Inläggstyper"
+
+#: modules/widgets/search.php:193
+msgid "Relevance"
+msgstr "Relevans"
+
+#: modules/widgets/search.php:347
+msgid "Sort by"
+msgstr "Sortera efter"
+
+#: modules/widgets/search.php:641
+msgid "Why aren't my filters appearing?"
+msgstr "Varför visas inte mina filter?"
+
+#: modules/widgets/search.php:635
+msgid "Adding filters requires JavaScript!"
+msgstr "JavaScript krävs för att lägga till filter!"
+
+#: modules/widgets/search.php:606
+msgid "Default sort order:"
+msgstr "Standard sorteringsordning:"
+
+#: modules/widgets/search.php:590
+msgid "Post types to search (minimum of 1):"
+msgstr "Antal inläggstyper att söka (minst 1):"
+
+#: modules/widgets/search.php:585
+msgid "Show sort selection dropdown"
+msgstr "Visa rullgardinsmeny för val av sortering"
+
+#: modules/widgets/search.php:193
+msgid "Relevance (recommended)"
+msgstr "Relevans (rekommenderas)"
+
+#: modules/search/class.jetpack-search-template-tags.php:109
+msgid "< Clear Filters"
+msgstr "< Rensa filter"
+
+#: modules/search/class.jetpack-search-helpers.php:198
+msgctxt "label for filtering posts"
+msgid "Year"
+msgstr "År"
+
+#: modules/search/class.jetpack-search-helpers.php:203
+msgctxt "label for filtering posts"
+msgid "Month Updated"
+msgstr "Månad uppdaterad"
+
+#: modules/search/class.jetpack-search-helpers.php:197
+msgctxt "label for filtering posts"
+msgid "Year Updated"
+msgstr "År uppdaterat"
+
+#: modules/module-info.php:496
+msgid ""
+"Improve your site's speed by only loading images visible on the screen.\n"
+"\t\tNew images will load just before they scroll into view. This prevents viewers\n"
+"\t\tfrom having to download all the images on a page all at once, even ones they can't see."
+msgstr ""
+"Förbättra hastigheten för din webbplats genom att endast ladda bilder som syns på skärmen.\n"
+"\t\tNya bilder kommer laddas precis innan de rullas in på skärmen. Detta gör att besökare\n"
+"\t\tinte behöver ladda ner alla bilder på sidan samtidigt, även sådana som de inte kan se."
+
+#: modules/module-info.php:476
+msgid ""
+"Jetpack will optimize your images and serve them from the server location nearest\n"
+"\t\tto your visitors. Using our global content delivery network will boost the loading speed of your site."
+msgstr ""
+"Jetpack kommer optimera dina bilder och tillhandahålla dem från serverplatsen närmast\n"
+"\t\tdina besökare. Genom att använda vårt globala leveransnätverk för innehåll kommer laddtiden för din webbplats förbättras."
+
+#: _inc/lib/plugins.php:61
+msgid "You are not allowed to install plugins on this site."
+msgstr "Det saknar behörighet att installera tillägg på denna webbplats."
+
+#: _inc/lib/plugins.php:39
+msgid "You are not allowed to activate plugins on this site."
+msgstr "Det saknar behörighet att aktivera tillägg på denna webbplats."
+
+#. translators: Comment moderation notification email subject. 1: Site name, 2:
+#. Post title
+#: _inc/lib/functions.wp-notify.php:331
+msgid "[%1$s] Please moderate: \"%2$s\""
+msgstr "[%1$s] Vänligen granska: \"%2$s\""
+
+#: _inc/lib/functions.wp-notify.php:320
+msgid "Currently %s comment is waiting for approval. Please visit the moderation panel:"
+msgid_plural "Currently %s comments are waiting for approval. Please visit the moderation panel:"
+msgstr[0] "För närvarande väntar %s kommentar på granskning. Vänligen besök modereringspanelen:"
+msgstr[1] "För närvarande väntar %s kommentarer på granskning. Vänligen besök modereringspanelen:"
+
+#: _inc/lib/functions.wp-notify.php:290
+msgid "Approve it: %s"
+msgstr "Godkänn den: %s"
+
+#. translators: 1: Post title
+#: _inc/lib/functions.wp-notify.php:263
+msgid "A new comment on the post \"%s\" is waiting for your approval"
+msgstr "En ny kommentar på inlägget ”%s” väntar på ditt godkännande"
+
+#: _inc/lib/functions.wp-notify.php:259
+msgid "Pingback excerpt: "
+msgstr "Pingback-utdrag:"
+
+#. translators: 1: Post title
+#: _inc/lib/functions.wp-notify.php:253
+msgid "A new pingback on the post \"%s\" is waiting for your approval"
+msgstr "En ny pingback på inlägget ”%s” väntar på ditt godkännande"
+
+#: _inc/lib/functions.wp-notify.php:249
+msgid "Trackback excerpt: "
+msgstr "Trackback-utdrag:"
+
+#. translators: 1: Post title
+#: _inc/lib/functions.wp-notify.php:243
+msgid "A new trackback on the post \"%s\" is waiting for your approval"
+msgstr "En ny trackback på inlägget ”%s” väntar på ditt godkännande"
+
+#: _inc/lib/functions.wp-notify.php:145 _inc/lib/functions.wp-notify.php:313
+msgid "Spam it: %s"
+msgstr "Markera som skräppost: %s"
+
+#: _inc/lib/functions.wp-notify.php:128
+msgid "Permalink: %s"
+msgstr "Permalänk: %s"
+
+#. translators: 1: Comment author URL
+#: _inc/lib/functions.wp-notify.php:115 _inc/lib/functions.wp-notify.php:268
+msgid "Email: %s"
+msgstr "E-post: %s"
+
+#. translators: 1: Trackback/pingback/comment author URL
+#: _inc/lib/functions.wp-notify.php:94 _inc/lib/functions.wp-notify.php:105
+#: _inc/lib/functions.wp-notify.php:116 _inc/lib/functions.wp-notify.php:248
+#: _inc/lib/functions.wp-notify.php:258 _inc/lib/functions.wp-notify.php:270
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#. translators: 1: Comment text
+#: _inc/lib/functions.wp-notify.php:95 _inc/lib/functions.wp-notify.php:106
+#: _inc/lib/functions.wp-notify.php:117 _inc/lib/functions.wp-notify.php:272
+msgid "Comment: %s"
+msgstr "Kommentar: %s"
+
+#: _inc/lib/functions.wp-notify.php:118
+msgid "You can see all comments on this post here:"
+msgstr "Du kan se alla kommentarer på detta inlägg här:"
+
+#: _inc/lib/functions.wp-notify.php:112
+msgid "New comment on your post \"%s\""
+msgstr "Ny kommentar till ditt inlägg ”%s”"
+
+#. translators: 1: blog name, 2: post title
+#: _inc/lib/functions.wp-notify.php:109
+msgid "[%1$s] Pingback: \"%2$s\""
+msgstr "[%1$s] Pingback: ”%2$s”"
+
+#: _inc/lib/functions.wp-notify.php:139 _inc/lib/functions.wp-notify.php:305
+msgid "Delete it: %s"
+msgstr "Ta bort det: %s"
+
+#: _inc/lib/functions.wp-notify.php:133 _inc/lib/functions.wp-notify.php:298
+msgid "Trash it: %s"
+msgstr "Flytta till papperskorgen: %s"
+
+#. translators: 1: blog name, 2: post title
+#: _inc/lib/functions.wp-notify.php:120
+msgid "[%1$s] Comment: \"%2$s\""
+msgstr "[%1$s] Kommentar: ”%2$s”"
+
+#. translators: 1: comment author, 2: comment author's IP address, 3: comment
+#. author's hostname
+#. translators: 1: Comment author name, 2: comment author's IP address, 3:
+#. comment author's hostname
+#: _inc/lib/functions.wp-notify.php:114 _inc/lib/functions.wp-notify.php:266
+msgid "Author: %1$s (IP address: %2$s, %3$s)"
+msgstr "Författare: %1$s (IP-adress: %2$s, %3$s)"
+
+#: _inc/lib/functions.wp-notify.php:107
+msgid "You can see all pingbacks on this post here:"
+msgstr "Du kan se alla pingbacks för inlägget här:"
+
+#. translators: 1: Post title
+#: _inc/lib/functions.wp-notify.php:102
+msgid "New pingback on your post \"%s\""
+msgstr "Ny pingback på ditt inlägg ”%s”"
+
+#. translators: 1: blog name, 2: post title
+#: _inc/lib/functions.wp-notify.php:98
+msgid "[%1$s] Trackback: \"%2$s\""
+msgstr "[%1$s] Trackback: ”%2$s”"
+
+#: _inc/lib/functions.wp-notify.php:96
+msgid "You can see all trackbacks on this post here:"
+msgstr "Du kan se alla trackbacks för inlägget här:"
+
+#. translators: 1: Trackback/pingback website name, 2: website IP address, 3:
+#. website hostname
+#: _inc/lib/functions.wp-notify.php:93 _inc/lib/functions.wp-notify.php:104
+#: _inc/lib/functions.wp-notify.php:246 _inc/lib/functions.wp-notify.php:256
+msgid "Website: %1$s (IP address: %2$s, %3$s)"
+msgstr "Webbplats: %1$s (IP-adress: %2$s, %3$s)"
+
+#. translators: 1: Post title
+#: _inc/lib/functions.wp-notify.php:91
+msgid "New trackback on your post \"%s\""
+msgstr "Ny trackback på ditt inlägg ”%s”"
+
+#: _inc/lib/class.core-rest-api-endpoints.php:2217
+msgid "Primary language for the site."
+msgstr "Förstaspråket för webbplatsen."
+
+#: _inc/jetpack-strings.php:256
+msgid "Design the perfect website"
+msgstr "Designa den perfekta webbplatsen"
+
+#: views/admin/must-connect-main-blog.php:10
+#: class.jetpack-connection-banner.php:293
+#: class.jetpack-connection-banner.php:340 _inc/jetpack-strings.php:575
+msgid "Set up Jetpack"
+msgstr "Konfigurera Jetpack"
+
+#: _inc/jetpack-strings.php:186
+msgid "Real-time backup of all your site data with unlimited space, one-click restores, and automated security scanning."
+msgstr "Säkerhetskopiera alla dina webbplatsdata i realtid med obegränsat utrymme, återställning med ett klick och automatisk säkerhetsskanning."
+
+#: 3rd-party/debug-bar/class.jetpack-search-debug-bar.php:123
+msgctxt "Text displayed when there is no information"
+msgid "None"
+msgstr "Ingen"
+
+#: 3rd-party/debug-bar/class.jetpack-search-debug-bar.php:169
+msgctxt "label for formatting JSON"
+msgid "Minify"
+msgstr "Minifiera"
+
+#: 3rd-party/debug-bar/class.jetpack-search-debug-bar.php:168
+msgctxt "label for formatting JSON"
+msgid "Pretty"
+msgstr "Vacker"
+
+#: 3rd-party/debug-bar/class.jetpack-search-debug-bar.php:121
+msgid "Last query information:"
+msgstr "Senaste sökinformationen:"
+
+#: 3rd-party/debug-bar/class.jetpack-search-debug-bar.php:26
+#: _inc/jetpack-strings.php:155 _inc/jetpack-strings.php:160
+#: _inc/jetpack-strings.php:224
+msgid "Jetpack Search"
+msgstr "Jetpack Sök"
+
+#: 3rd-party/debug-bar/class.jetpack-search-debug-bar.php:103
+msgctxt "displayed in search results when results are cached"
+msgid "cache hit"
+msgstr "cache-träff"
+
+#: modules/widgets/social-icons.php:353 modules/widgets/search.php:817
+msgid "Remove"
+msgstr "Ta bort"
+
+#: modules/widgets/search.php:775
+msgid "Choose an interval:"
+msgstr "Välj ett intervall:"
+
+#: modules/widgets/search.php:767
+msgid "Modified GMT"
+msgstr "Modifierad GMT"
+
+#: modules/widgets/search.php:764
+msgid "Modified"
+msgstr "Modifierad"
+
+#: modules/widgets/search.php:761
+msgid "Date GMT"
+msgstr "Datum GMT"
+
+#: modules/widgets/search.php:755
+msgid "Choose a field:"
+msgstr "Välj ett fält:"
+
+#: modules/widgets/search.php:729
+msgid "Choose a taxonomy:"
+msgstr "Välj en taxonomi:"
+
+#: modules/widgets/search.php:717
+msgid "Post Type"
+msgstr "Inläggstyp"
+
+#: modules/widgets/search.php:714
+msgid "Taxonomy"
+msgstr "Taxonomi"
+
+#: modules/widgets/search.php:711
+msgid "Filter Type:"
+msgstr "Filtertyp:"
+
+#: modules/widgets/search.php:573
+msgid "Show search box"
+msgstr "Visa sökruta"
+
+#: modules/protect/blocked-login-page.php:604
+msgid "%s Get help unlocking your site"
+msgstr "%s Få hjälp med att låsa upp din webbplats"
+
+#: modules/protect/blocked-login-page.php:601
+msgid "%s Back"
+msgstr "%s Tillbaka"
+
+#: modules/protect/blocked-login-page.php:318
+msgid "Send email"
+msgstr "Skicka e-post"
+
+#: modules/protect/blocked-login-page.php:315
+msgid "Your email"
+msgstr "Din e-post"
+
+#: modules/protect/blocked-login-page.php:303
+msgid "
Your IP address %2$s has been flagged for potential security violations. You can unlock your login by sending yourself a special link via email. Learn More
"
+msgstr "
Din IP-adress %2$s har flaggats för potentiella säkerhetsproblem. Du kan låsa upp din inloggning genom att skicka en speciell länk via e-post till dig själv. Läs mer
+ no effect on your site visitors, they will continue to view your site as usual, but for you it will look as if you had just installed WordPress for the first time.', 'health-check' ); ?>
+
+
+
+ any changes you make to settings will be kept when you disable Troubleshooting Mode.', 'health-check' ); ?>
+
+
+
+ severity ) ) {
+ $result->severity = 'warning';
+ }
+
+ $tests[ $method ] = $result;
+ }
+
+ return $tests;
+ }
+
+ public function test_contant_DISALLOW_FILE_MODS() {
+ return $this->check_constants( 'DISALLOW_FILE_MODS', false );
+ }
+
+ public function test_contant_AUTOMATIC_UPDATER_DISABLED() {
+ return $this->check_constants( 'AUTOMATIC_UPDATER_DISABLED', false );
+ }
+
+ public function test_contant_WP_AUTO_UPDATE_CORE() {
+ return $this->check_constants( 'WP_AUTO_UPDATE_CORE', true );
+ }
+
+ /**
+ * Test if auto-updates related constants are set correctly.
+ *
+ * @since 5.2.0
+ *
+ * @param string $constant The name of the constant to check.
+ * @param bool $value The value that the constant should be, if set.
+ * @return array The test results.
+ */
+ public function check_constants( $constant, $value ) {
+ if ( defined( $constant ) && constant( $constant ) != $value ) {
+ return array(
+ 'description' => sprintf(
+ /* translators: %s: Name of the constant used. */
+ __( 'The %s constant is defined and enabled.', 'health-check' ),
+ "$constant"
+ ),
+ 'severity' => 'fail',
+ );
+ }
+ }
+
+ /**
+ * Check if updates are intercepted by a filter.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test results.
+ */
+ public function test_wp_version_check_attached() {
+ if ( ! is_main_site() ) {
+ return;
+ }
+
+ $cookies = wp_unslash( $_COOKIE );
+ $timeout = 10;
+ $headers = array(
+ 'Cache-Control' => 'no-cache',
+ );
+
+ // Include Basic auth in loopback requests.
+ if ( isset( $_SERVER['PHP_AUTH_USER'] ) && isset( $_SERVER['PHP_AUTH_PW'] ) ) {
+ $headers['Authorization'] = 'Basic ' . base64_encode( wp_unslash( $_SERVER['PHP_AUTH_USER'] ) . ':' . wp_unslash( $_SERVER['PHP_AUTH_PW'] ) );
+ }
+
+ $url = add_query_arg(
+ array(
+ 'health-check-test-wp_version_check' => true,
+ ),
+ admin_url( '' )
+ );
+
+ $test = wp_remote_get( $url, compact( 'cookies', 'headers', 'timeout' ) );
+
+ if ( is_wp_error( $test ) ) {
+ return array(
+ 'description' => sprintf(
+ /* translators: %s: Name of the filter used. */
+ __( 'Could not confirm that the %s filter is available.', 'health-check' ),
+ 'wp_version_check()'
+ ),
+ 'severity' => 'warning',
+ );
+ }
+
+ $response = wp_remote_retrieve_body( $test );
+
+ if ( 'yes' !== $response ) {
+ return array(
+ 'description' => sprintf(
+ /* translators: %s: Name of the filter used. */
+ __( 'A plugin has prevented updates by disabling %s.', 'health-check' ),
+ 'wp_version_check()'
+ ),
+ 'severity' => 'fail',
+ );
+ }
+ }
+
+ /**
+ * Check if automatic updates are disabled by a filter.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test results.
+ */
+ public function test_filters_automatic_updater_disabled() {
+ if ( apply_filters( 'automatic_updater_disabled', false ) ) {
+ return array(
+ 'description' => sprintf(
+ /* translators: %s: Name of the filter used. */
+ __( 'The %s filter is enabled.', 'health-check' ),
+ 'automatic_updater_disabled'
+ ),
+ 'severity' => 'fail',
+ );
+ }
+ }
+
+ /**
+ * Check if automatic updates have tried to run, but failed, previously.
+ *
+ * @since 5.2.0
+ *
+ * @return array|bool The test results. false if the auto updates failed.
+ */
+ function test_if_failed_update() {
+ $failed = get_site_option( 'auto_core_update_failed' );
+
+ if ( ! $failed ) {
+ return false;
+ }
+
+ if ( ! empty( $failed['critical'] ) ) {
+ $description = __( 'A previous automatic background update ended with a critical failure, so updates are now disabled.', 'health-check' );
+ $description .= ' ' . __( 'You would have received an email because of this.', 'health-check' );
+ $description .= ' ' . __( "When you've been able to update using the \"Update Now\" button on Dashboard > Updates, we'll clear this error for future update attempts.", 'health-check' );
+ $description .= ' ' . sprintf(
+ /* translators: %s: Code of error shown. */
+ __( 'The error code was %s.', 'health-check' ),
+ '' . $failed['error_code'] . ''
+ );
+ return array(
+ 'description' => $description,
+ 'severity' => 'warning',
+ );
+ }
+
+ $description = __( 'A previous automatic background update could not occur.', 'health-check' );
+ if ( empty( $failed['retry'] ) ) {
+ $description .= ' ' . __( 'You would have received an email because of this.', 'health-check' );
+ }
+
+ $description .= ' ' . __( "We'll try again with the next release.", 'health-check' );
+ $description .= ' ' . sprintf(
+ /* translators: %s: Code of error shown. */
+ __( 'The error code was %s.', 'health-check' ),
+ '' . $failed['error_code'] . ''
+ );
+ return array(
+ 'description' => $description,
+ 'severity' => 'warning',
+ );
+ }
+
+ /**
+ * Check if WordPress is controlled by a VCS (Git, Subversion etc).
+ *
+ * @since 5.2.0
+ *
+ * @return array The test results.
+ */
+ public function test_vcs_abspath() {
+ $context_dirs = array( ABSPATH );
+ $vcs_dirs = array( '.svn', '.git', '.hg', '.bzr' );
+ $check_dirs = array();
+
+ foreach ( $context_dirs as $context_dir ) {
+ // Walk up from $context_dir to the root.
+ do {
+ $check_dirs[] = $context_dir;
+
+ // Once we've hit '/' or 'C:\', we need to stop. dirname will keep returning the input here.
+ if ( dirname( $context_dir ) == $context_dir ) {
+ break;
+ }
+
+ // Continue one level at a time.
+ } while ( $context_dir = dirname( $context_dir ) );
+ }
+
+ $check_dirs = array_unique( $check_dirs );
+
+ // Search all directories we've found for evidence of version control.
+ foreach ( $vcs_dirs as $vcs_dir ) {
+ foreach ( $check_dirs as $check_dir ) {
+ // phpcs:ignore
+ if ( $checkout = @is_dir( rtrim( $check_dir, '\\/' ) . "/$vcs_dir" ) ) {
+ break 2;
+ }
+ }
+ }
+
+ if ( $checkout && ! apply_filters( 'automatic_updates_is_vcs_checkout', true, ABSPATH ) ) {
+ return array(
+ 'description' => sprintf(
+ // translators: 1: Folder name. 2: Version control directory. 3: Filter name.
+ __( 'The folder %1$s was detected as being under version control (%2$s), but the %3$s filter is allowing updates.', 'health-check' ),
+ '' . $check_dir . '',
+ "$vcs_dir",
+ 'automatic_updates_is_vcs_checkout'
+ ),
+ 'severity' => 'info',
+ );
+ }
+
+ if ( $checkout ) {
+ return array(
+ 'description' => sprintf(
+ // translators: 1: Folder name. 2: Version control directory.
+ __( 'The folder %1$s was detected as being under version control (%2$s).', 'health-check' ),
+ '' . $check_dir . '',
+ "$vcs_dir"
+ ),
+ 'severity' => 'fail',
+ );
+ }
+
+ return array(
+ 'description' => __( 'No version control systems were detected.', 'health-check' ),
+ 'severity' => 'pass',
+ );
+ }
+
+ /**
+ * Check if we can access files without providing credentials.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test results.
+ */
+ function test_check_wp_filesystem_method() {
+ $skin = new Automatic_Upgrader_Skin;
+ $success = $skin->request_filesystem_credentials( false, ABSPATH );
+
+ if ( ! $success ) {
+ $description = __( 'Your installation of WordPress prompts for FTP credentials to perform updates.', 'health-check' );
+ $description .= ' ' . __( '(Your site is performing updates over FTP due to file ownership. Talk to your hosting company.)', 'health-check' );
+
+ return array(
+ 'description' => $description,
+ 'severity' => 'fail',
+ );
+ }
+
+ return array(
+ 'description' => __( "Your installation of WordPress doesn't require FTP credentials to perform updates.", 'health-check' ),
+ 'severity' => 'pass',
+ );
+ }
+
+ /**
+ * Check if core files are writable by the web user/group.
+ *
+ * @since 5.2.0
+ *
+ * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
+ *
+ * @return array|bool The test results. false if they're not writeable.
+ */
+ function test_all_files_writable() {
+ global $wp_filesystem;
+
+ include ABSPATH . WPINC . '/version.php'; // $wp_version; // x.y.z
+
+ $skin = new Automatic_Upgrader_Skin;
+ $success = $skin->request_filesystem_credentials( false, ABSPATH );
+
+ if ( ! $success ) {
+ return false;
+ }
+
+ WP_Filesystem();
+
+ if ( 'direct' != $wp_filesystem->method ) {
+ return false;
+ }
+
+ $checksums = get_core_checksums( $wp_version, 'en_US' );
+ $dev = ( false !== strpos( $wp_version, '-' ) );
+ // Get the last stable version's files and test against that
+ if ( ! $checksums && $dev ) {
+ $checksums = get_core_checksums( (float) $wp_version - 0.1, 'en_US' );
+ }
+
+ // There aren't always checksums for development releases, so just skip the test if we still can't find any
+ if ( ! $checksums && $dev ) {
+ return false;
+ }
+
+ if ( ! $checksums ) {
+ $description = sprintf(
+ // translators: %s: WordPress version
+ __( "Couldn't retrieve a list of the checksums for WordPress %s.", 'health-check' ),
+ $wp_version
+ );
+ $description .= ' ' . __( 'This could mean that connections are failing to WordPress.org.', 'health-check' );
+ return array(
+ 'description' => $description,
+ 'severity' => 'warning',
+ );
+ }
+
+ $unwritable_files = array();
+ foreach ( array_keys( $checksums ) as $file ) {
+ if ( 'wp-content' == substr( $file, 0, 10 ) ) {
+ continue;
+ }
+ if ( ! file_exists( ABSPATH . $file ) ) {
+ continue;
+ }
+ if ( ! is_writable( ABSPATH . $file ) ) {
+ $unwritable_files[] = $file;
+ }
+ }
+
+ if ( $unwritable_files ) {
+ if ( count( $unwritable_files ) > 20 ) {
+ $unwritable_files = array_slice( $unwritable_files, 0, 20 );
+ $unwritable_files[] = '...';
+ }
+ return array(
+ 'description' => __( 'Some files are not writable by WordPress:', 'health-check' ) . '
' . implode( '
', $unwritable_files ) . '
',
+ 'severity' => 'fail',
+ );
+ } else {
+ return array(
+ 'description' => __( 'All of your WordPress files are writable.', 'health-check' ),
+ 'severity' => 'pass',
+ );
+ }
+ }
+
+ /**
+ * Check if the install is using a development branch and can use nightly packages.
+ *
+ * @since 5.2.0
+ *
+ * @return array|bool The test results. false if it isn't a development version.
+ */
+ function test_accepts_dev_updates() {
+ include ABSPATH . WPINC . '/version.php'; // $wp_version; // x.y.z
+ // Only for dev versions
+ if ( false === strpos( $wp_version, '-' ) ) {
+ return false;
+ }
+
+ if ( defined( 'WP_AUTO_UPDATE_CORE' ) && ( 'minor' === WP_AUTO_UPDATE_CORE || false === WP_AUTO_UPDATE_CORE ) ) {
+ return array(
+ 'description' => sprintf(
+ /* translators: %s: Name of the constant used. */
+ __( 'WordPress development updates are blocked by the %s constant.', 'health-check' ),
+ 'WP_AUTO_UPDATE_CORE'
+ ),
+ 'severity' => 'fail',
+ );
+ }
+
+ if ( ! apply_filters( 'allow_dev_auto_core_updates', $wp_version ) ) {
+ return array(
+ 'description' => sprintf(
+ /* translators: %s: Name of the filter used. */
+ __( 'WordPress development updates are blocked by the %s filter.', 'health-check' ),
+ 'allow_dev_auto_core_updates'
+ ),
+ 'severity' => 'fail',
+ );
+ }
+ }
+
+ /**
+ * Check if the site supports automatic minor updates.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test results.
+ */
+ function test_accepts_minor_updates() {
+ if ( defined( 'WP_AUTO_UPDATE_CORE' ) && false === WP_AUTO_UPDATE_CORE ) {
+ return array(
+ 'description' => sprintf(
+ /* translators: %s: Name of the constant used. */
+ __( 'WordPress security and maintenance releases are blocked by %s.', 'health-check' ),
+ "define( 'WP_AUTO_UPDATE_CORE', false );"
+ ),
+ 'severity' => 'fail',
+ );
+ }
+
+ if ( ! apply_filters( 'allow_minor_auto_core_updates', true ) ) {
+ return array(
+ 'description' => sprintf(
+ /* translators: %s: Name of the filter used. */
+ __( 'WordPress security and maintenance releases are blocked by the %s filter.', 'health-check' ),
+ 'allow_minor_auto_core_updates'
+ ),
+ 'severity' => 'fail',
+ );
+ }
+ }
+}
diff --git a/wp-content/plugins/health-check/includes/class-health-check-dashboard-widget.php b/wp-content/plugins/health-check/includes/class-health-check-dashboard-widget.php
new file mode 100644
index 000000000..2fe4d4f3c
--- /dev/null
+++ b/wp-content/plugins/health-check/includes/class-health-check-dashboard-widget.php
@@ -0,0 +1,95 @@
+ 0,
+ 'recommended' => 0,
+ 'critical' => 0,
+ );
+ }
+
+ $issues_total = $issue_counts->recommended + $issue_counts->critical;
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Visit the Site Health page to gather information on about your site..', 'health-check' ),
+ esc_url( admin_url( 'tools.php?page=health-check' ) )
+ );
+ ?>
+
+
+
+
+ critical > 0 ) : ?>
+
+
+
+
+
+
+
+
+
+ 0 && false !== $get_issues ) : ?>
+
+ %1$d items on the Site Health Check status page.', 'health-check' ),
+ $issues_total,
+ esc_url( admin_url( 'tools.php?page=health-check' ) )
+ );
+ ?>
+
';
+
+ $message .= ' ';
+ }
+
+ $response = array(
+ 'message' => $message,
+ );
+
+ delete_option( 'health-check-default-theme' );
+
+ wp_send_json_success( $response );
+
+ die();
+ }
+
+ /**
+ * Test individual plugins for loopback compatibility issues.
+ *
+ * This function will perform the loopback check, without any plugins, then conditionally enables one plugin at a time.
+ *
+ * @uses ob_start()
+ * @uses Health_Check_Troubleshoot::mu_plugin_exists()
+ * @uses Health_Check::get_filesystem_credentials()
+ * @uses Health_Check_Troubleshoot::setup_must_use_plugin()
+ * @uses ob_get_clean()
+ * @uses wp_send_json_error()
+ * @uses delete_option()
+ * @uses get_option()
+ * @uses md5()
+ * @uses rand()
+ * @uses update_option()
+ * @uses explode()
+ * @uses Health_Check_Loopback::can_perform_loopback()
+ * @uses sprintf()
+ * @uses esc_attr()
+ * @uses esc_html__()
+ * @uses esc_html()
+ * @uses wp_send_json_success()
+ *
+ * @return void
+ */
+ static function loopback_test_individual_plugins() {
+ check_ajax_referer( 'health-check-loopback-individual-plugins' );
+
+ if ( ! current_user_can( 'view_site_health_checks' ) ) {
+ wp_send_json_error();
+ }
+
+ ob_start();
+
+ $needs_creds = false;
+
+ if ( ! Health_Check_Troubleshoot::mu_plugin_exists() ) {
+ if ( ! Health_Check::get_filesystem_credentials() ) {
+ $needs_creds = true;
+ } else {
+ Health_Check_Troubleshoot::setup_must_use_plugin();
+ }
+ }
+
+ $result = ob_get_clean();
+
+ if ( $needs_creds ) {
+ wp_send_json_error( $result );
+ die();
+ }
+
+ delete_option( 'health-check-disable-plugin-hash' );
+
+ $loopback_hash = md5( rand() );
+ update_option( 'health-check-disable-plugin-hash', $loopback_hash );
+
+ $plugin_slug = explode( '/', $_POST['plugin'] );
+ $plugin_slug = $plugin_slug[0];
+
+ $single_test = Health_Check_Loopback::can_perform_loopback( $loopback_hash, $plugin_slug );
+
+ $message = sprintf(
+ ' %s',
+ esc_attr( $single_test->status ),
+ $single_test->message
+ );
+
+ $response = array(
+ 'message' => $message,
+ );
+
+ wp_send_json_success( $response );
+
+ die();
+ }
+
+ static function loopback_test_default_theme() {
+ check_ajax_referer( 'health-check-loopback-default-theme' );
+
+ if ( ! current_user_can( 'view_site_health_checks' ) ) {
+ wp_send_json_error();
+ }
+
+ ob_start();
+
+ $needs_creds = false;
+
+ if ( ! Health_Check_Troubleshoot::mu_plugin_exists() ) {
+ if ( ! Health_Check::get_filesystem_credentials() ) {
+ $needs_creds = true;
+ } else {
+ Health_Check_Troubleshoot::setup_must_use_plugin();
+ }
+ }
+
+ $result = ob_get_clean();
+
+ if ( $needs_creds ) {
+ wp_send_json_error( $result );
+ die();
+ }
+
+ delete_option( 'health-check-disable-plugin-hash' );
+
+ $loopback_hash = md5( rand() );
+ update_option( 'health-check-disable-plugin-hash', $loopback_hash );
+
+ $message = '';
+
+ // Test without a theme active.
+ update_option( 'health-check-default-theme', 'yes' );
+
+ $theme_test = Health_Check_Loopback::can_perform_loopback( $loopback_hash, '' );
+
+ $message .= sprintf(
+ ' %s',
+ esc_attr( $theme_test->status ),
+ $theme_test->message
+ );
+
+ delete_option( 'health-check-default-theme' );
+
+ $response = array(
+ 'message' => $message,
+ );
+
+ wp_send_json_success( $response );
+
+ die();
+ }
+}
diff --git a/wp-content/plugins/health-check/includes/class-health-check-site-status.php b/wp-content/plugins/health-check/includes/class-health-check-site-status.php
new file mode 100644
index 000000000..8d8262631
--- /dev/null
+++ b/wp-content/plugins/health-check/includes/class-health-check-site-status.php
@@ -0,0 +1,2039 @@
+init();
+ }
+
+ public function init() {
+ $this->prepare_sql_data();
+
+ add_action( 'wp_ajax_health-check-site-status', array( $this, 'site_status' ) );
+
+ add_action( 'wp_ajax_health-check-site-status-result', array( $this, 'site_status_result' ) );
+
+ add_action( 'admin_init', array( $this, 'check_wp_version_check_exists' ) );
+
+ add_action( 'health-check-scheduled-site-status-check', array( $this, 'scheduled_check' ) );
+ }
+
+ /**
+ * Run the SQL version checks.
+ *
+ * These values are used in later tests, but the part of preparing them is more easily managed early
+ * in the class for ease of access and discovery.
+ *
+ * @since 5.2.0
+ *
+ * @global wpdb $wpdb WordPress database abstraction object.
+ */
+ private function prepare_sql_data() {
+ global $wpdb;
+
+ if ( method_exists( $wpdb, 'db_version' ) ) {
+ if ( $wpdb->use_mysqli ) {
+ // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysqli_get_server_info
+ $mysql_server_type = mysqli_get_server_info( $wpdb->dbh );
+ } else {
+ // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysql_get_server_info
+ $mysql_server_type = mysql_get_server_info( $wpdb->dbh );
+ }
+
+ $this->mysql_server_version = $wpdb->get_var( 'SELECT VERSION()' );
+ }
+
+ $this->health_check_mysql_rec_version = '5.6';
+
+ if ( stristr( $mysql_server_type, 'mariadb' ) ) {
+ $this->is_mariadb = true;
+ $this->health_check_mysql_rec_version = '10.0';
+ }
+
+ $this->mysql_min_version_check = version_compare( '5.5', $this->mysql_server_version, '<=' );
+ $this->mysql_rec_version_check = version_compare( $this->health_check_mysql_rec_version, $this->mysql_server_version, '<=' );
+ }
+
+ /**
+ * Test if `wp_version_check` is blocked.
+ *
+ * It's possible to block updates with the `wp_version_check` filter, but this can't be checked during an
+ * AJAX call, as the filter is never introduced then.
+ *
+ * This filter overrides a normal page request if it's made by an admin through the AJAX call with the
+ * right query argument to check for this.
+ *
+ * @since 5.2.0
+ */
+ public function check_wp_version_check_exists() {
+ if ( ! is_admin() || ! is_user_logged_in() || ! current_user_can( 'update_core' ) || ! isset( $_GET['health-check-test-wp_version_check'] ) ) {
+ return;
+ }
+
+ echo ( has_filter( 'wp_version_check', 'wp_version_check' ) ? 'yes' : 'no' );
+
+ die();
+ }
+
+ public function site_status_result() {
+ check_ajax_referer( 'health-check-site-status-result' );
+
+ if ( ! current_user_can( 'view_site_health_checks' ) ) {
+ wp_send_json_error();
+ }
+
+ set_transient( 'health-check-site-status-result', wp_json_encode( $_POST['counts'] ) );
+ }
+
+ public function site_status() {
+ check_ajax_referer( 'health-check-site-status' );
+
+ if ( ! current_user_can( 'view_site_health_checks' ) ) {
+ wp_send_json_error();
+ }
+
+ $function = sprintf(
+ 'json_test_%s',
+ $_POST['feature']
+ );
+
+ if ( ! method_exists( $this, $function ) || ! is_callable( array( $this, $function ) ) ) {
+ return;
+ }
+
+ $call = call_user_func( array( $this, $function ) );
+ }
+
+ /**
+ * Tests for WordPress version and outputs it.
+ *
+ * Gives various results depending on what kind of updates are available, if any, to encourage the
+ * user to install security updates as a priority.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test result.
+ */
+ public function get_test_wordpress_version() {
+ $result = array(
+ 'label' => '',
+ 'status' => '',
+ 'badge' => array(
+ 'label' => __( 'Performance', 'health-check' ),
+ 'color' => 'blue',
+ ),
+ 'description' => '',
+ 'actions' => '',
+ 'test' => 'wordpress_version',
+ );
+
+ $core_current_version = get_bloginfo( 'version' );
+ $core_updates = get_core_updates();
+
+ if ( ! is_array( $core_updates ) ) {
+ $result['status'] = 'recommended';
+
+ $result['label'] = sprintf(
+ // translators: %s: Your current version of WordPress.
+ __( 'WordPress version %s', 'health-check' ),
+ $core_current_version
+ );
+
+ $result['description'] = sprintf(
+ '
%s
',
+ __( 'We were unable to check if any new versions of WordPress are available.', 'health-check' )
+ );
+
+ $result['actions'] = sprintf(
+ '%s',
+ esc_url( admin_url( 'update-core.php?force-check=1' ) ),
+ __( 'Check for updates manually', 'health-check' )
+ );
+ } else {
+ foreach ( $core_updates as $core => $update ) {
+ if ( 'upgrade' === $update->response ) {
+ $current_version = explode( '.', $core_current_version );
+ $new_version = explode( '.', $update->version );
+
+ $current_major = $current_version[0] . '.' . $current_version[1];
+ $new_major = $new_version[0] . '.' . $new_version[1];
+
+ $result['label'] = sprintf(
+ // translators: %s: The latest version of WordPress available.
+ __( 'WordPress update available (%s)', 'health-check' ),
+ $update->version
+ );
+
+ $result['actions'] = sprintf(
+ '%s',
+ esc_url( admin_url( 'update-core.php' ) ),
+ __( 'Install the latest version of WordPress', 'health-check' )
+ );
+
+ if ( $current_major !== $new_major ) {
+ // This is a major version mismatch.
+ $result['status'] = 'recommended';
+ $result['description'] = sprintf(
+ '
%s
',
+ __( 'A new version of WordPress is available.', 'health-check' )
+ );
+ } else {
+ // This is a minor version, sometimes considered more critical.
+ $result['status'] = 'critical';
+ $result['badge']['label'] = __( 'Security', 'health-check' );
+ $result['description'] = sprintf(
+ '
%s
',
+ __( 'A new minor update is available for your site. Because minor updates often address security, it’s important to install them.', 'health-check' )
+ );
+ }
+ } else {
+ $result['status'] = 'good';
+ $result['label'] = sprintf(
+ // translators: %s: The current version of WordPress installed on this site.
+ __( 'Your WordPress version is up to date (%s)', 'health-check' ),
+ $core_current_version
+ );
+
+ $result['description'] = sprintf(
+ '
%s
',
+ __( 'You are currently running the latest version of WordPress available, keep it up!', 'health-check' )
+ );
+ }
+ }
+ }
+
+ return $result;
+ }
+
+ public function test_wordpress_version() {
+ $check = $this->get_test_wordpress_version();
+
+ printf( ' %s', esc_attr( $check['status'] ), esc_html( $check['label'] ) );
+ }
+
+ public function json_wordpress_version() {
+ wp_send_json_success( $this->get_test_wordpress_version() );
+ }
+
+ /**
+ * Check if the user is currently in Troubleshooting Mode or not.
+ *
+ * @return bool
+ */
+ public function is_troubleshooting() {
+ // Check if a session cookie to disable plugins has been set.
+ if ( isset( $_COOKIE['wp-health-check-disable-plugins'] ) ) {
+ $_GET['health-check-disable-plugin-hash'] = $_COOKIE['wp-health-check-disable-plugins'];
+ }
+
+ // If the disable hash isn't set, no need to interact with things.
+ if ( ! isset( $_GET['health-check-disable-plugin-hash'] ) ) {
+ return false;
+ }
+
+ $disable_hash = get_option( 'health-check-disable-plugin-hash', null );
+
+ if ( empty( $disable_hash ) ) {
+ return false;
+ }
+
+ // If the plugin hash is not valid, we also break out
+ if ( $disable_hash !== $_GET['health-check-disable-plugin-hash'] ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Test if plugins are outdated, or unnecessary.
+ *
+ * The tests checks if your plugins are up to date, and encourages you to remove any that are not in use.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test result.
+ */
+ public function get_test_plugin_version() {
+ $result = array(
+ 'label' => __( 'Your plugins are up to date', 'health-check' ),
+ 'status' => 'good',
+ 'badge' => array(
+ 'label' => __( 'Security', 'health-check' ),
+ 'color' => 'blue',
+ ),
+ 'description' => sprintf(
+ '
%s
',
+ __( 'Plugins extend your site’s functionality with things like contact forms, ecommerce and much more. That means they have deep access to your site, so it’s vital to keep them up to date.', 'health-check' )
+ ),
+ 'actions' => sprintf(
+ '
',
+ esc_url( admin_url( 'plugins.php' ) ),
+ __( 'Manage your plugins', 'health-check' )
+ ),
+ 'test' => 'plugin_version',
+ );
+
+ $plugins = get_plugins();
+ $plugin_updates = get_plugin_updates();
+
+ $plugins_have_updates = false;
+ $plugins_active = 0;
+ $plugins_total = 0;
+ $plugins_need_update = 0;
+
+ // Loop over the available plugins and check their versions and active state.
+ foreach ( $plugins as $plugin_path => $plugin ) {
+ $plugins_total++;
+
+ if ( is_plugin_active( $plugin_path ) ) {
+ $plugins_active++;
+ }
+
+ $plugin_version = $plugin['Version'];
+
+ if ( array_key_exists( $plugin_path, $plugin_updates ) ) {
+ $plugins_need_update++;
+ $plugins_have_updates = true;
+ }
+ }
+
+ // Add a notice if there are outdated plugins.
+ if ( $plugins_need_update > 0 ) {
+ $result['status'] = 'critical';
+
+ $result['label'] = __( 'You have plugins waiting to be updated', 'health-check' );
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: %d: The number of outdated plugins. */
+ _n(
+ 'Your site has %d plugin waiting to be updated.',
+ 'Your site has %d plugins waiting to be updated.',
+ $plugins_need_update,
+ 'health-check'
+ ),
+ $plugins_need_update
+ )
+ );
+
+ $result['actions'] .= sprintf(
+ '
',
+ __( 'Your site has 1 active plugin, and it is up to date.', 'health-check' )
+ );
+ } else {
+ $result['description'] .= sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: %d: The number of active plugins. */
+ _n(
+ 'Your site has %d active plugin, and they are all up to date.',
+ 'Your site has %d active plugins, and they are all up to date.',
+ $plugins_active,
+ 'health-check'
+ ),
+ $plugins_active
+ )
+ );
+ }
+ }
+
+ // Check if there are inactive plugins.
+ if ( $plugins_total > $plugins_active && ! is_multisite() ) {
+ $unused_plugins = $plugins_total - $plugins_active;
+
+ $result['status'] = 'recommended';
+
+ $result['label'] = __( 'You should remove inactive plugins', 'health-check' );
+
+ $result['description'] .= sprintf(
+ '
%s %s
',
+ sprintf(
+ /* translators: %d: The number of inactive plugins. */
+ _n(
+ 'Your site has %d inactive plugin.',
+ 'Your site has %d inactive plugins.',
+ $unused_plugins,
+ 'health-check'
+ ),
+ $unused_plugins
+ ),
+ __( 'Inactive plugins are tempting targets for attackers. If you’re not going to use a plugin, we recommend you remove it.', 'health-check' )
+ );
+
+ $result['actions'] .= sprintf(
+ '
',
+ esc_url( admin_url( 'plugins.php?plugin_status=inactive' ) ),
+ __( 'Manage inactive plugins', 'health-check' )
+ );
+ }
+
+ return $result;
+ }
+
+ /**
+ * Test if themes are outdated, or unnecessary.
+ *
+ * The tests checks if your site has a default theme (to fall back on if there is a need), if your themes
+ * are up to date and, finally, encourages you to remove any themes that are not needed.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test results.
+ */
+ public function get_test_theme_version() {
+ $result = array(
+ 'label' => __( 'Your themes are up to date', 'health-check' ),
+ 'status' => 'good',
+ 'badge' => array(
+ 'label' => __( 'Security', 'health-check' ),
+ 'color' => 'blue',
+ ),
+ 'description' => sprintf(
+ '
%s
',
+ __( 'Themes add your site’s look and feel. It’s important to keep them up to date, to stay consistent with your brand and keep your site secure.', 'health-check' )
+ ),
+ 'actions' => sprintf(
+ '
',
+ esc_url( admin_url( 'themes.php' ) ),
+ __( 'Manage your themes', 'health-check' )
+ ),
+ 'test' => 'theme_version',
+ );
+
+ $theme_updates = get_theme_updates();
+
+ $themes_total = 0;
+ $themes_need_updates = 0;
+ $themes_inactive = 0;
+
+ // This value is changed during processing to determine how many themes are considered a reasonable amount.
+ $allowed_theme_count = 1;
+
+ $has_default_theme = false;
+ $has_unused_themes = false;
+ $show_unused_themes = true;
+ $using_default_theme = false;
+
+ // Populate a list of all themes available in the install.
+ $all_themes = wp_get_themes();
+ $active_theme = wp_get_theme();
+
+ foreach ( $all_themes as $theme_slug => $theme ) {
+ $themes_total++;
+
+ if ( WP_DEFAULT_THEME === $theme_slug ) {
+ $has_default_theme = true;
+
+ if ( get_stylesheet() === $theme_slug ) {
+ $using_default_theme = true;
+ }
+ }
+
+ if ( array_key_exists( $theme_slug, $theme_updates ) ) {
+ $themes_need_updates++;
+ }
+ }
+
+ // If this is a child theme, increase the allowed theme count by one, to account for the parent.
+ if ( $active_theme->parent() ) {
+ $allowed_theme_count++;
+
+ if ( $active_theme->get_template() === WP_DEFAULT_THEME ) {
+ $using_default_theme = true;
+ }
+ }
+
+ // If there's a default theme installed and not in use, we count that as allowed as well.
+ if ( $has_default_theme && ! $using_default_theme ) {
+ $allowed_theme_count++;
+ }
+
+ if ( $themes_total > $allowed_theme_count ) {
+ $has_unused_themes = true;
+ $themes_inactive = ( $themes_total - $allowed_theme_count );
+ }
+
+ // Check if any themes need to be updated.
+ if ( $themes_need_updates > 0 ) {
+ $result['status'] = 'critical';
+
+ $result['label'] = __( 'You have themes waiting to be updated', 'health-check' );
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: %d: The number of outdated themes. */
+ _n(
+ 'Your site has %d theme waiting to be updated.',
+ 'Your site has %d themes waiting to be updated.',
+ $themes_need_updates,
+ 'health-check'
+ ),
+ $themes_need_updates
+ )
+ );
+ } else {
+ // Give positive feedback about the site being good about keeping things up to date.
+ if ( 1 === $themes_total ) {
+ $result['description'] .= sprintf(
+ '
%s
',
+ __( 'Your site has 1 installed theme, and it is up to date.', 'health-check' )
+ );
+ } else {
+ $result['description'] .= sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: %d: The number of themes. */
+ _n(
+ 'Your site has %d installed theme, and they are all up to date.',
+ 'Your site has %d installed themes, and they are all up to date.',
+ $themes_total,
+ 'health-check'
+ ),
+ $themes_total
+ )
+ );
+ }
+ }
+
+ if ( $has_unused_themes && $show_unused_themes && ! is_multisite() ) {
+
+ // This is a child theme, so we want to be a bit more explicit in our messages.
+ if ( $active_theme->parent() ) {
+ // Recommend removing inactive themes, except a default theme, your current one, and the parent theme.
+ $result['status'] = 'recommended';
+
+ $result['label'] = __( 'You should remove inactive themes', 'health-check' );
+
+ if ( $using_default_theme ) {
+ $result['description'] .= sprintf(
+ '
%s %s
',
+ sprintf(
+ /* translators: %d: The number of inactive themes. */
+ _n(
+ 'Your site has %d inactive theme.',
+ 'Your site has %d inactive themes.',
+ $themes_inactive,
+ 'health-check'
+ ),
+ $themes_inactive
+ ),
+ sprintf(
+ /* translators: 1: The currently active theme. 2: The active theme's parent theme. */
+ __( 'To enhance your site’s security, we recommend you remove any themes you’re not using. You should keep your current theme, %1$s, and %2$s, its parent theme.', 'health-check' ),
+ $active_theme->name,
+ $active_theme->parent()->name
+ )
+ );
+ } else {
+ $result['description'] .= sprintf(
+ '
%s %s
',
+ sprintf(
+ /* translators: %d: The number of inactive themes. */
+ _n(
+ 'Your site has %d inactive theme.',
+ 'Your site has %d inactive themes.',
+ $themes_inactive,
+ 'health-check'
+ ),
+ $themes_inactive
+ ),
+ sprintf(
+ /* translators: 1: The default theme for WordPress. 2: The currently active theme. 3: The active theme's parent theme. */
+ __( 'To enhance your site’s security, we recommend you remove any themes you’re not using. You should keep %1$s, the default WordPress theme, %2$s, your current theme, and %3$s, its parent theme.', 'health-check' ),
+ WP_DEFAULT_THEME,
+ $active_theme->name,
+ $active_theme->parent()->name
+ )
+ );
+ }
+ } else {
+ // Recommend removing all inactive themes.
+ $result['status'] = 'recommended';
+
+ $result['label'] = __( 'You should remove inactive themes', 'health-check' );
+
+ if ( $using_default_theme ) {
+ $result['description'] .= sprintf(
+ '
%s %s
',
+ sprintf(
+ /* translators: 1: The amount of inactive themes. 2: The currently active theme. */
+ _n(
+ 'Your site has %1$d inactive theme, other than %2$s, your active theme.',
+ 'Your site has %1$d inactive themes, other than %2$s, your active theme.',
+ $themes_inactive,
+ 'health-check'
+ ),
+ $themes_inactive,
+ $active_theme->name
+ ),
+ __( 'We recommend removing any unused themes to enhance your site’s security.', 'health-check' )
+ );
+ } else {
+ $result['description'] .= sprintf(
+ '
%s %s
',
+ sprintf(
+ /* translators: 1: The amount of inactive themes. 2: The default theme for WordPress. 3: The currently active theme. */
+ _n(
+ 'Your site has %1$d inactive theme, other than %2$s, the default WordPress theme, and %3$s, your active theme.',
+ 'Your site has %1$d inactive themes, other than %2$s, the default WordPress theme, and %3$s, your active theme.',
+ $themes_inactive,
+ 'health-check'
+ ),
+ $themes_inactive,
+ WP_DEFAULT_THEME,
+ $active_theme->name
+ ),
+ __( 'We recommend removing any unused themes to enhance your site’s security.', 'health-check' )
+ );
+ }
+ }
+ }
+
+ // If not default Twenty* theme exists.
+ if ( ! $has_default_theme ) {
+ $result['status'] = 'recommended';
+
+ $result['label'] = __( 'Have a default theme available', 'health-check' );
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ __( 'Your site does not have any default theme. Default themes are used by WordPress automatically if anything is wrong with your normal theme.', 'health-check' )
+ );
+ }
+
+ return $result;
+ }
+
+ /**
+ * Test if the supplied PHP version is supported.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test results.
+ */
+ public function get_test_php_version() {
+ $response = wp_check_php_version();
+
+ $result = array(
+ 'label' => sprintf(
+ // translators: %s: The current PHP version.
+ __( 'PHP is up to date (%s)', 'health-check' ),
+ PHP_VERSION
+ ),
+ 'status' => 'good',
+ 'badge' => array(
+ 'label' => __( 'Performance', 'health-check' ),
+ 'color' => 'blue',
+ ),
+ 'description' => sprintf(
+ '
%s
',
+ __( 'PHP is the programming language we use to build and maintain WordPress. Newer versions of PHP are both faster and more secure, so updating will have a positive effect on your site’s performance.', 'health-check' )
+ ),
+ 'actions' => sprintf(
+ '
',
+ esc_url( wp_get_update_php_url() ),
+ __( 'Learn more about updating PHP', 'health-check' ),
+ /* translators: accessibility text */
+ __( '(opens in a new tab)', 'health-check' )
+ ),
+ 'test' => 'php_version',
+ );
+
+ // PHP is up to date.
+ if ( ! $response || version_compare( PHP_VERSION, $response['recommended_version'], '>=' ) ) {
+ return $result;
+ }
+
+ // The PHP version is older than the recommended version, but still acceptable.
+ if ( $response['is_supported'] ) {
+ $result['label'] = __( 'We recommend that you update PHP', 'health-check' );
+ $result['status'] = 'recommended';
+
+ return $result;
+ }
+
+ // The PHP version is only receiving security fixes.
+ if ( $response['is_secure'] ) {
+ $result['label'] = __( 'Your PHP version should be updated', 'health-check' );
+ $result['status'] = 'recommended';
+
+ return $result;
+ }
+
+ // Anything no longer secure must be updated.
+ $result['label'] = __( 'Your PHP version requires an update', 'health-check' );
+ $result['status'] = 'critical';
+ $result['badge']['label'] = __( 'Security', 'health-check' );
+
+ return $result;
+ }
+
+ /**
+ * Check if the passed extension or function are available.
+ *
+ * Make the check for available PHP modules into a simple boolean operator for a cleaner test runner.
+ *
+ * @since 5.2.0
+ *
+ * @param string $extension Optional. The extension name to test. Default null.
+ * @param string $function Optional. The function name to test. Default null.
+ * @param string $constant Optional. The constant to text for. Default null.
+ *
+ * @return bool Whether or not the extension and function are available.
+ */
+ private function test_php_extension_availability( $extension = null, $function = null, $constant = null ) {
+ // If no extension or function is passed, claim to fail testing, as we have nothing to test against.
+ if ( ! $extension && ! $function && ! $constant ) {
+ return false;
+ }
+
+ if ( $extension && ! extension_loaded( $extension ) ) {
+ return false;
+ }
+ if ( $function && ! function_exists( $function ) ) {
+ return false;
+ }
+ if ( $constant && ! defined( $constant ) ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Test if required PHP modules are installed on the host.
+ *
+ * This test builds on the recommendations made by the WordPress Hosting Team
+ * as seen at https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions
+ *
+ * @since 5.2.0
+ *
+ * @return array
+ */
+ public function get_test_php_extensions() {
+ $result = array(
+ 'label' => __( 'Required and recommended modules are installed', 'health-check' ),
+ 'status' => 'good',
+ 'badge' => array(
+ 'label' => __( 'Performance', 'health-check' ),
+ 'color' => 'blue',
+ ),
+ 'description' => sprintf(
+ '
%s
%s
',
+ __( 'PHP modules perform most of the tasks on the server that make your site run. Any changes to these must be made by your server administrator.', 'health-check' ),
+ sprintf(
+ /* translators: %s: Link to the hosting group page about recommended PHP modules. */
+ __( 'The WordPress Hosting Team maintains a list of those modules, both recommended and required, in %s.', 'health-check' ),
+ sprintf(
+ '%2$s %3$s',
+ /* translators: Localized team handbook, if one exists. */
+ esc_url( __( 'https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions', 'health-check' ) ),
+ __( 'the team handbook', 'health-check' ),
+ /* translators: accessibility text */
+ __( '(opens in a new tab)', 'health-check' )
+ )
+ )
+ ),
+ 'actions' => '',
+ 'test' => 'php_extensions',
+ );
+
+ $modules = array(
+ 'bcmath' => array(
+ 'function' => 'bcadd',
+ 'required' => false,
+ ),
+ 'curl' => array(
+ 'function' => 'curl_version',
+ 'required' => false,
+ ),
+ 'exif' => array(
+ 'function' => 'exif_read_data',
+ 'required' => false,
+ ),
+ 'filter' => array(
+ 'function' => 'filter_list',
+ 'required' => false,
+ ),
+ 'fileinfo' => array(
+ 'function' => 'finfo_file',
+ 'required' => false,
+ ),
+ 'mod_xml' => array(
+ 'extension' => 'libxml',
+ 'required' => false,
+ ),
+ 'mysqli' => array(
+ 'function' => 'mysqli_connect',
+ 'required' => false,
+ ),
+ 'libsodium' => array(
+ 'constant' => 'SODIUM_LIBRARY_VERSION',
+ 'required' => false,
+ 'php_bundled_version' => '7.2.0',
+ ),
+ 'openssl' => array(
+ 'function' => 'openssl_encrypt',
+ 'required' => false,
+ ),
+ 'pcre' => array(
+ 'function' => 'preg_match',
+ 'required' => false,
+ ),
+ 'imagick' => array(
+ 'extension' => 'imagick',
+ 'required' => false,
+ ),
+ 'gd' => array(
+ 'extension' => 'gd',
+ 'required' => false,
+ 'fallback_for' => 'imagick',
+ ),
+ 'mcrypt' => array(
+ 'extension' => 'mcrypt',
+ 'required' => false,
+ 'fallback_for' => 'libsodium',
+ ),
+ 'xmlreader' => array(
+ 'extension' => 'xmlreader',
+ 'required' => false,
+ 'fallback_for' => 'xml',
+ ),
+ 'zlib' => array(
+ 'extension' => 'zlib',
+ 'required' => false,
+ 'fallback_for' => 'zip',
+ ),
+ 'mbstring' => array(
+ 'extension' => 'mbstring',
+ 'required' => true,
+ ),
+ 'json' => array(
+ 'extension' => 'json',
+ 'required' => true,
+ ),
+ );
+
+ /**
+ * An array representing all the modules we wish to test for.
+ *
+ * @since 5.2.0
+ *
+ * @param array $modules {
+ * An associated array of modules to test for.
+ *
+ * array $module {
+ * An associated array of module properties used during testing.
+ * One of either `$function` or `$extension` must be provided, or they will fail by default.
+ *
+ * string $function Optional. A function name to test for the existence of.
+ * string $extension Optional. An extension to check if is loaded in PHP.
+ * string $constant Optional. A constant to check for to verify an extension exists.
+ * bool $required Is this a required feature or not.
+ * string $fallback_for Optional. The module this module replaces as a fallback.
+ * }
+ * }
+ */
+ $modules = apply_filters( 'site_status_test_php_modules', $modules );
+
+ $failures = array();
+
+ foreach ( $modules as $library => $module ) {
+ $extension = ( isset( $module['extension'] ) ? $module['extension'] : null );
+ $function = ( isset( $module['function'] ) ? $module['function'] : null );
+ $constant = ( isset( $module['constant'] ) ? $module['constant'] : null );
+
+ // If this module is a fallback for another function, check if that other function passed.
+ if ( isset( $module['fallback_for'] ) ) {
+ /*
+ * If that other function has a failure, mark this module as required for normal operations.
+ * If that other function hasn't failed, skip this test as it's only a fallback.
+ */
+ if ( isset( $failures[ $module['fallback_for'] ] ) ) {
+ $module['required'] = true;
+ } else {
+ continue;
+ }
+ }
+
+ if ( ! $this->test_php_extension_availability( $extension, $function, $constant ) && ( ! isset( $module['php_bundled_version'] ) || version_compare( PHP_VERSION, $module['php_bundled_version'], '<' ) ) ) {
+ if ( $module['required'] ) {
+ $result['status'] = 'critical';
+
+ $class = 'error';
+ $screen_reader = __( 'Error', 'health-check' );
+ $message = sprintf(
+ /* translators: %s: The module name. */
+ __( 'The required module, %s, is not installed, or has been disabled.', 'health-check' ),
+ $library
+ );
+ } else {
+ $class = 'warning';
+ $screen_reader = __( 'Warning', 'health-check' );
+ $message = sprintf(
+ /* translators: %s: The module name. */
+ __( 'The optional module, %s, is not installed, or has been disabled.', 'health-check' ),
+ $library
+ );
+ }
+
+ if ( ! $module['required'] && 'good' === $result['status'] ) {
+ $result['status'] = 'recommended';
+ }
+
+ $failures[ $library ] = "$screen_reader $message";
+ }
+ }
+
+ if ( ! empty( $failures ) ) {
+ $output = '
';
+ }
+
+ if ( 'good' !== $result['status'] ) {
+ if ( 'recommended' === $result['status'] ) {
+ $result['label'] = __( 'One or more recommended modules are missing', 'health-check' );
+ }
+ if ( 'critical' === $result['status'] ) {
+ $result['label'] = __( 'One or more required modules are missing', 'health-check' );
+ }
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ $output
+ );
+ }
+
+ return $result;
+ }
+
+ /**
+ * Test if the SQL server is up to date.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test results.
+ */
+ public function get_test_sql_server() {
+ $result = array(
+ 'label' => __( 'SQL server is up to date', 'health-check' ),
+ 'status' => 'good',
+ 'badge' => array(
+ 'label' => __( 'Performance', 'health-check' ),
+ 'color' => 'blue',
+ ),
+ 'description' => sprintf(
+ '
%s
',
+ __( 'The SQL server is a required piece of software for the database WordPress uses to store all your site’s content and settings.', 'health-check' )
+ ),
+ 'actions' => sprintf(
+ '
',
+ /* translators: Localized version of WordPress requirements if one exists. */
+ esc_url( __( 'https://wordpress.org/about/requirements/', 'health-check' ) ),
+ __( 'Read more about what WordPress requires to run.', 'health-check' ),
+ /* translators: accessibility text */
+ __( '(opens in a new tab)', 'health-check' )
+ ),
+ 'test' => 'sql_server',
+ );
+
+ $db_dropin = file_exists( WP_CONTENT_DIR . '/db.php' );
+
+ if ( ! $this->mysql_rec_version_check ) {
+ $result['status'] = 'recommended';
+
+ $result['label'] = __( 'Outdated SQL server', 'health-check' );
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: 1: The database engine in use (MySQL or MariaDB). 2: Database server recommended version number. */
+ __( 'For optimal performance and security reasons, we recommend running %1$s version %2$s or higher. Contact your web hosting company to correct this.', 'health-check' ),
+ ( $this->is_mariadb ? 'MariaDB' : 'MySQL' ),
+ $this->health_check_mysql_rec_version
+ )
+ );
+ }
+
+ if ( ! $this->mysql_min_version_check ) {
+ $result['status'] = 'critical';
+
+ $result['label'] = __( 'Severely outdated SQL server', 'health-check' );
+ $result['badge']['label'] = __( 'Security', 'health-check' );
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: 1: The database engine in use (MySQL or MariaDB). 2: Database server minimum version number. */
+ __( 'WordPress requires %1$s version %2$s or higher. Contact your web hosting company to correct this.', 'health-check' ),
+ ( $this->is_mariadb ? 'MariaDB' : 'MySQL' ),
+ $this->health_check_mysql_required_version
+ )
+ );
+ }
+
+ if ( $db_dropin ) {
+ $result['description'] .= sprintf(
+ '
%s
',
+ wp_kses(
+ sprintf(
+ /* translators: 1: The name of the drop-in. 2: The name of the database engine. */
+ __( 'You are using a %1$s drop-in which might mean that a %2$s database is not being used.', 'health-check' ),
+ 'wp-content/db.php',
+ ( $this->is_mariadb ? 'MariaDB' : 'MySQL' )
+ ),
+ array(
+ 'code' => true,
+ )
+ )
+ );
+ }
+
+ return $result;
+ }
+
+ /**
+ * Test if the database server is capable of using utf8mb4.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test results.
+ */
+ public function get_test_utf8mb4_support() {
+ global $wpdb;
+
+ $result = array(
+ 'label' => __( 'UTF8MB4 is supported', 'health-check' ),
+ 'status' => 'good',
+ 'badge' => array(
+ 'label' => __( 'Performance', 'health-check' ),
+ 'color' => 'blue',
+ ),
+ 'description' => sprintf(
+ '
%s
',
+ __( 'UTF8MB4 is a database storage attribute that makes sure your site can store non-English text and other strings (for instance emoticons) without unexpected problems.', 'health-check' )
+ ),
+ 'actions' => '',
+ 'test' => 'utf8mb4_support',
+ );
+
+ if ( ! $this->is_mariadb ) {
+ if ( version_compare( $this->mysql_server_version, '5.5.3', '<' ) ) {
+ $result['status'] = 'recommended';
+
+ $result['label'] = __( 'utf8mb4 requires a MySQL update', 'health-check' );
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: %s: Version number. */
+ __( 'WordPress’ utf8mb4 support requires MySQL version %s or greater. Please contact your server administrator.', 'health-check' ),
+ '5.5.3'
+ )
+ );
+ } else {
+ $result['description'] .= sprintf(
+ '
%s
',
+ __( 'Your MySQL version supports utf8mb4.', 'health-check' )
+ );
+ }
+ } else { // MariaDB introduced utf8mb4 support in 5.5.0
+ if ( version_compare( $this->mysql_server_version, '5.5.0', '<' ) ) {
+ $result['status'] = 'recommended';
+
+ $result['label'] = __( 'utf8mb4 requires a MariaDB update', 'health-check' );
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: %s: Version number. */
+ __( 'WordPress’ utf8mb4 support requires MariaDB version %s or greater. Please contact your server administrator.', 'health-check' ),
+ '5.5.0'
+ )
+ );
+ } else {
+ $result['description'] .= sprintf(
+ '
%s
',
+ __( 'Your MariaDB version supports utf8mb4.', 'health-check' )
+ );
+ }
+ }
+
+ if ( $wpdb->use_mysqli ) {
+ // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysqli_get_client_info
+ $mysql_client_version = mysqli_get_client_info();
+ } else {
+ // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysql_get_client_info
+ $mysql_client_version = mysql_get_client_info();
+ }
+
+ /*
+ * libmysql has supported utf8mb4 since 5.5.3, same as the MySQL server.
+ * mysqlnd has supported utf8mb4 since 5.0.9.
+ */
+ if ( false !== strpos( $mysql_client_version, 'mysqlnd' ) ) {
+ $mysql_client_version = preg_replace( '/^\D+([\d.]+).*/', '$1', $mysql_client_version );
+ if ( version_compare( $mysql_client_version, '5.0.9', '<' ) ) {
+ $result['status'] = 'recommended';
+
+ $result['label'] = __( 'utf8mb4 requires a newer client library', 'health-check' );
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: 1: Name of the library, 2: Number of version. */
+ __( 'WordPress’ utf8mb4 support requires MySQL client library (%1$s) version %2$s or newer. Please contact your server administrator.', 'health-check' ),
+ 'mysqlnd',
+ '5.0.9'
+ )
+ );
+ }
+ } else {
+ if ( version_compare( $mysql_client_version, '5.5.3', '<' ) ) {
+ $result['status'] = 'recommended';
+
+ $result['label'] = __( 'utf8mb4 requires a newer client library', 'health-check' );
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: 1: Name of the library, 2: Number of version. */
+ __( 'WordPress’ utf8mb4 support requires MySQL client library (%1$s) version %2$s or newer. Please contact your server administrator.', 'health-check' ),
+ 'libmysql',
+ '5.5.3'
+ )
+ );
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * Test if the site can communicate with WordPress.org.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test results.
+ */
+ public function get_test_dotorg_communication() {
+ $result = array(
+ 'label' => __( 'Can communicate with WordPress.org', 'health-check' ),
+ 'status' => '',
+ 'badge' => array(
+ 'label' => __( 'Security', 'health-check' ),
+ 'color' => 'blue',
+ ),
+ 'description' => sprintf(
+ '
%s
',
+ __( 'Communicating with the WordPress servers is used to check for new versions, and to both install and update WordPress core, themes or plugins.', 'health-check' )
+ ),
+ 'actions' => '',
+ 'test' => 'dotorg_communication',
+ );
+
+ $wp_dotorg = wp_remote_get(
+ 'https://api.wordpress.org',
+ array(
+ 'timeout' => 10,
+ )
+ );
+ if ( ! is_wp_error( $wp_dotorg ) ) {
+ $result['status'] = 'good';
+ } else {
+ $result['status'] = 'critical';
+
+ $result['label'] = __( 'Could not reach WordPress.org', 'health-check' );
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ sprintf(
+ '%s %s',
+ __( 'Error', 'health-check' ),
+ sprintf(
+ /* translators: 1: The IP address WordPress.org resolves to. 2: The error returned by the lookup. */
+ __( 'Your site is unable to reach WordPress.org at %1$s, and returned the error: %2$s', 'health-check' ),
+ gethostbyname( 'api.wordpress.org' ),
+ $wp_dotorg->get_error_message()
+ )
+ )
+ );
+
+ $result['actions'] = sprintf(
+ '
',
+ /* translators: Localized Support reference. */
+ esc_url( __( 'https://wordpress.org/support', 'health-check' ) ),
+ __( 'Get help resolving this issue.', 'health-check' ),
+ /* translators: accessibility text */
+ __( '(opens in a new tab)', 'health-check' )
+ );
+ }
+
+ return $result;
+ }
+
+ public function json_test_dotorg_communication() {
+ wp_send_json_success( $this->get_test_dotorg_communication() );
+ }
+
+ /**
+ * Test if the site is using timezones relative to their location, or by using an offset value.
+ *
+ * Daylight Savings Time (DST) may affect the times used and shown by your site, and using an UTC offset,
+ * instead of a localized timezone, means that the site does not get automatic DST updates.
+ *
+ * This check looks for default or UTC values and recommends changing to a fixed location.
+ *
+ * @return array The test results.
+ */
+ public function get_test_timezone_not_utc() {
+ $result = array(
+ 'label' => __( 'Your site uses localized timezones', 'health-check' ),
+ 'status' => 'good',
+ 'badge' => array(
+ 'label' => __( 'Performance', 'health-check' ),
+ 'color' => 'blue',
+ ),
+ 'description' => sprintf(
+ '
%s
',
+ __( 'Daylight Savings Time (DST) may affect the times used and shown by your site, and using an UTC offset, instead of a localized timezone, means that the site does not get automatic DST updates.', 'health-check' )
+ ),
+ 'actions' => '',
+ 'test' => 'timezone_not_utc',
+ );
+
+ $timezone = get_option( 'timezone_string', null );
+
+ if ( empty( $timezone ) || 'UTC' === substr( $timezone, 0, 3 ) ) {
+ $result['status'] = 'recommended';
+ $result['label'] = __( 'Your site is not using localized timezones', 'health-check' );
+
+ $result['actions'] .= sprintf(
+ '
',
+ esc_url( admin_url( 'options-general.php' ) ),
+ __( 'Update your site timezone', 'health-check' )
+ );
+ }
+
+ return $result;
+ }
+
+ /**
+ * Test if debug information is enabled.
+ *
+ * When WP_DEBUG is enabled, errors and information may be disclosed to site visitors, or it may be
+ * logged to a publicly accessible file.
+ *
+ * Debugging is also frequently left enabled after looking for errors on a site, as site owners do
+ * not understand the implications of this.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test results.
+ */
+ public function get_test_is_in_debug_mode() {
+ $result = array(
+ 'label' => __( 'Your site is not set to output debug information', 'health-check' ),
+ 'status' => 'good',
+ 'badge' => array(
+ 'label' => __( 'Security', 'health-check' ),
+ 'color' => 'blue',
+ ),
+ 'description' => sprintf(
+ '
%s
',
+ __( 'Debug mode is often enabled to gather more details about an error or site failure, but may contain sensitive information which should not be available on a publicly available website.', 'health-check' )
+ ),
+ 'actions' => sprintf(
+ '
',
+ /* translators: Documentation explaining debugging in WordPress. */
+ esc_url( __( 'https://wordpress.org/support/article/debugging-in-wordpress/', 'health-check' ) ),
+ __( 'Read about debugging in WordPress.', 'health-check' ),
+ /* translators: accessibility text */
+ __( '(opens in a new tab)', 'health-check' )
+ ),
+ 'test' => 'is_in_debug_mode',
+ );
+
+ if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
+ if ( defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG ) {
+ $result['label'] = __( 'Your site is set to log errors to a potentially public file.', 'health-check' );
+
+ $result['status'] = 'critical';
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: %s: WP_DEBUG_LOG */
+ __( 'The value, %s, has been added to this website’s configuration file. This means any errors on the site will be written to a file which is potentially available to normal users.', 'health-check' ),
+ 'WP_DEBUG_LOG'
+ )
+ );
+ }
+
+ if ( defined( 'WP_DEBUG_DISPLAY' ) && WP_DEBUG_DISPLAY ) {
+ $result['label'] = __( 'Your site is set to display errors to site visitors', 'health-check' );
+
+ $result['status'] = 'critical';
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: 1: WP_DEBUG_DISPLAY, 2: WP_DEBUG */
+ __( 'The value, %1$s, has either been enabled by %2$s or added to your configuration file. This will make errors display on the front end of your site.', 'health-check' ),
+ 'WP_DEBUG_DISPLAY',
+ 'WP_DEBUG'
+ )
+ );
+ }
+ }
+
+ return $result;
+ }
+
+ public function json_test_is_in_debug_mode() {
+ wp_send_json_success( $this->get_test_is_in_debug_mode() );
+ }
+
+ /**
+ * Test if your site is serving content over HTTPS.
+ *
+ * Many sites have varying degrees of HTTPS support, the most common of which is sites that have it
+ * enabled, but only if you visit the right site address.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test results.
+ */
+ public function get_test_https_status() {
+ $result = array(
+ 'label' => __( 'Your website is using an active HTTPS connection.', 'health-check' ),
+ 'status' => 'good',
+ 'badge' => array(
+ 'label' => __( 'Security', 'health-check' ),
+ 'color' => 'blue',
+ ),
+ 'description' => sprintf(
+ '
%s
',
+ __( 'An HTTPS connection is needed for many features on the web today, it also gains the trust of your visitors by helping to protecting their online privacy.', 'health-check' )
+ ),
+ 'actions' => sprintf(
+ '
',
+ /* translators: Documentation explaining HTTPS and why it should be used. */
+ esc_url( __( 'https://wordpress.org/support/article/why-should-i-use-https/', 'health-check' ) ),
+ __( 'Read more about why you should use HTTPS', 'health-check' ),
+ /* translators: accessibility text */
+ __( '(opens in a new tab)', 'health-check' )
+ ),
+ 'test' => 'https_status',
+ );
+
+ if ( is_ssl() ) {
+ $wp_url = get_bloginfo( 'wpurl' );
+ $site_url = get_bloginfo( 'url' );
+
+ if ( 'https' !== substr( $wp_url, 0, 5 ) || 'https' !== substr( $site_url, 0, 5 ) ) {
+ $result['status'] = 'recommended';
+
+ $result['label'] = __( 'Only parts of your site are using HTTPS', 'health-check' );
+
+ $result['description'] = sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: %s: URL to Settings > General to change options. */
+ __( 'You are accessing this website using HTTPS, but your WordPress Address is not set up to use HTTPS by default.', 'health-check' ),
+ esc_url( admin_url( 'options-general.php' ) )
+ )
+ );
+
+ $result['actions'] .= sprintf(
+ '
',
+ esc_url( admin_url( 'options-general.php' ) ),
+ __( 'Update your site addresses', 'health-check' )
+ );
+ }
+ } else {
+ $result['status'] = 'recommended';
+
+ $result['label'] = __( 'Your site does not use HTTPS', 'health-check' );
+ }
+
+ return $result;
+ }
+
+ /**
+ * Check if the HTTP API can handle SSL/TLS requests.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test results.
+ */
+ public function get_test_ssl_support() {
+ $result = array(
+ 'label' => '',
+ 'status' => '',
+ 'badge' => array(
+ 'label' => __( 'Security', 'health-check' ),
+ 'color' => 'blue',
+ ),
+ 'description' => sprintf(
+ '
%s
',
+ __( 'Securely communicating between servers are needed for transactions such as fetching files, conducting sales on store sites, and much more.', 'health-check' )
+ ),
+ 'actions' => '',
+ 'test' => 'ssl_support',
+ );
+
+ $supports_https = wp_http_supports( array( 'ssl' ) );
+
+ if ( $supports_https ) {
+ $result['status'] = 'good';
+
+ $result['label'] = __( 'Your site can communicate securely with other services', 'health-check' );
+ } else {
+ $result['status'] = 'critical';
+
+ $result['label'] = __( 'Your site is unable to communicate securely with other services', 'health-check' );
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ __( 'Talk to your web host about OpenSSL support for PHP.', 'health-check' )
+ );
+ }
+
+ return $result;
+ }
+
+ /**
+ * Test if scheduled events run as intended.
+ *
+ * If scheduled events are not running, this may indicate something with WP_Cron is not working as intended,
+ * or that there are orphaned events hanging around from older code.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test results.
+ */
+ public function get_test_scheduled_events() {
+ $result = array(
+ 'label' => __( 'Scheduled events are running', 'health-check' ),
+ 'status' => 'good',
+ 'badge' => array(
+ 'label' => __( 'Performance', 'health-check' ),
+ 'color' => 'blue',
+ ),
+ 'description' => sprintf(
+ '
%s
',
+ __( 'Scheduled events are what periodically looks for updates to plugins, themes and WordPress itself. It is also what makes sure scheduled posts are published on time. It may also be used by various plugins to make sure that planned actions are executed.', 'health-check' )
+ ),
+ 'actions' => '',
+ 'test' => 'scheduled_events',
+ );
+
+ $schedule = new Health_Check_WP_Cron();
+
+ if ( is_wp_error( $schedule->has_missed_cron() ) ) {
+ $result['status'] = 'critical';
+
+ $result['label'] = __( 'It was not possible to check your scheduled events', 'health-check' );
+
+ $result['description'] = sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: %s: The error message returned while from the cron scheduler. */
+ __( 'While trying to test your site’s scheduled events, the following error was returned: %s', 'health-check' ),
+ $schedule->has_missed_cron()->get_error_message()
+ )
+ );
+ } elseif ( $schedule->has_missed_cron() ) {
+ $result['status'] = 'recommended';
+
+ $result['label'] = __( 'A scheduled event has failed', 'health-check' );
+
+ $result['description'] = sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: %s: The name of the failed cron event. */
+ __( 'The scheduled event, %s, failed to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended.', 'health-check' ),
+ $schedule->last_missed_cron
+ )
+ );
+ } elseif ( $schedule->has_late_cron() ) {
+ $result['status'] = 'recommended';
+
+ $result['label'] = __( 'A scheduled event is late', 'health-check' );
+
+ $result['description'] = sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: %s: The name of the late cron event. */
+ __( 'The scheduled event, %s, is late to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended.', 'health-check' ),
+ $schedule->last_late_cron
+ )
+ );
+ }
+
+ return $result;
+ }
+
+ /**
+ * Test if WordPress can run automated background updates.
+ *
+ * Background updates in WordPress are primarily used for minor releases and security updates. It's important
+ * to either have these working, or be aware that they are intentionally disabled for whatever reason.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test results.
+ */
+ public function get_test_background_updates() {
+ $result = array(
+ 'label' => __( 'Background updates are working', 'health-check' ),
+ 'status' => 'good',
+ 'badge' => array(
+ 'label' => __( 'Security', 'health-check' ),
+ 'color' => 'blue',
+ ),
+ 'description' => sprintf(
+ '
%s
',
+ __( 'Background updates ensure that WordPress can auto-update if a security update is released for the version you are currently using.', 'health-check' )
+ ),
+ 'actions' => '',
+ 'test' => 'background_updates',
+ );
+
+ // Run the auto-update tests in a separate class,
+ // as there are many considerations to be made.
+ $automatic_updates = new Health_Check_Auto_Updates();
+ $tests = $automatic_updates->run_tests();
+
+ $output = '
';
+
+ foreach ( $tests as $test ) {
+ $severity_string = __( 'Passed', 'health-check' );
+
+ if ( 'fail' === $test->severity ) {
+ $result['label'] = __( 'Background updates are not working as expected', 'health-check' );
+
+ $result['status'] = 'critical';
+
+ $severity_string = __( 'Error', 'health-check' );
+ }
+
+ if ( 'warning' === $test->severity && 'good' === $result['status'] ) {
+ $result['label'] = __( 'Background updates may not be working properly', 'health-check' );
+
+ $result['status'] = 'recommended';
+
+ $severity_string = __( 'Warning', 'health-check' );
+ }
+
+ $output .= sprintf(
+ '
',
+ esc_html__( 'Plugins or themes may have their own way of handling updates, which could break or negatively impact normal updates in WordPress.', 'health-check' )
+ ),
+ 'actions' => '',
+ 'test' => 'extension_updates',
+ );
+
+ $updates = new Health_Check_Updates();
+ $tests = $updates->run_tests();
+
+ $output = '
';
+
+ foreach ( $tests as $test ) {
+ $severity_string = esc_html__( 'Passed', 'health-check' );
+
+ if ( 'fail' === $test->severity ) {
+ $result['label'] = esc_html__( 'Plugin or theme updates are not working', 'health-check' );
+
+ $result['status'] = 'critical';
+
+ $severity_string = esc_html__( 'Error', 'health-check' );
+ }
+
+ if ( 'warning' === $test->severity && 'good' === $result['status'] ) {
+ $result['label'] = esc_html__( 'Some plugin or theme updates may not work as expected', 'health-check' );
+
+ $result['status'] = 'recommended';
+
+ $severity_string = esc_html__( 'Warning', 'health-check' );
+ }
+
+ $output .= sprintf(
+ '
',
+ $output
+ );
+ }
+
+ return $result;
+ }
+
+ /**
+ * Test if loopbacks work as expected.
+ *
+ * A loopback is when WordPress queries itself, for example to start a new WP_Cron instance, or when editing a
+ * plugin or theme. This has shown itself to be a recurring issue as code can very easily break this interaction.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test results.
+ */
+ public function get_test_loopback_requests() {
+ $result = array(
+ 'label' => __( 'Your site can perform loopback requests', 'health-check' ),
+ 'status' => 'good',
+ 'badge' => array(
+ 'label' => __( 'Performance', 'health-check' ),
+ 'color' => 'blue',
+ ),
+ 'description' => sprintf(
+ '
%s
',
+ __( 'Loopback requests are used to run scheduled events, and are also used by the built-in editors for themes and plugins to verify code stability.', 'health-check' )
+ ),
+ 'actions' => '',
+ 'test' => 'loopback_requests',
+ );
+
+ $loopback = new Health_Check_Loopback();
+
+ $check_loopback = $loopback->can_perform_loopback();
+
+ $result['status'] = $check_loopback->status;
+
+ if ( 'good' !== $check_loopback->status ) {
+ $result['label'] = __( 'Your site could not complete a loopback request', 'health-check' );
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ $check_loopback->message
+ );
+ }
+
+ return $result;
+ }
+
+ public function json_test_loopback_requests() {
+ wp_send_json_success( $this->get_test_loopback_requests() );
+ }
+
+ /**
+ * Test if HTTP requests are blocked.
+ *
+ * It's possible to block all outgoing communication (with the possibility of whitelisting hosts) via the
+ * HTTP API. This may create problems for users as many features are running as services these days.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test results.
+ */
+ public function get_test_http_requests() {
+ $result = array(
+ 'label' => __( 'HTTP requests seem to be working as expected', 'health-check' ),
+ 'status' => 'good',
+ 'badge' => array(
+ 'label' => __( 'Performance', 'health-check' ),
+ 'color' => 'blue',
+ ),
+ 'description' => sprintf(
+ '
%s
',
+ __( 'It is possible for site maintainers to block all, or some, communication to other sites and services. If set up incorrectly, this may prevent plugins and themes from working as intended.', 'health-check' )
+ ),
+ 'actions' => '',
+ 'test' => 'http_requests',
+ );
+
+ $blocked = false;
+ $hosts = array();
+
+ if ( defined( 'WP_HTTP_BLOCK_EXTERNAL' ) ) {
+ $blocked = true;
+ }
+
+ if ( defined( 'WP_ACCESSIBLE_HOSTS' ) ) {
+ $hosts = explode( ',', WP_ACCESSIBLE_HOSTS );
+ }
+
+ if ( $blocked && 0 === sizeof( $hosts ) ) {
+ $result['status'] = 'critical';
+
+ $result['label'] = __( 'HTTP requests are blocked', 'health-check' );
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: %s: Name of the constant used. */
+ __( 'HTTP requests have been blocked by the %s constant, with no allowed hosts.', 'health-check' ),
+ 'WP_HTTP_BLOCK_EXTERNAL'
+ )
+ );
+ }
+
+ if ( $blocked && 0 < sizeof( $hosts ) ) {
+ $result['status'] = 'recommended';
+
+ $result['label'] = __( 'HTTP requests are partially blocked', 'health-check' );
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: 1: Name of the constant used. 2: List of hostnames whitelisted. */
+ __( 'HTTP requests have been blocked by the %1$s constant, with some hosts whitelisted: %2$s.', 'health-check' ),
+ 'WP_HTTP_BLOCK_EXTERNAL',
+ implode( ',', $hosts )
+ )
+ );
+ }
+
+ return $result;
+ }
+
+ /**
+ * Test if the REST API is accessible.
+ *
+ * Various security measures may block the REST API from working, or it may have been disabled in general.
+ * This is required for the new block editor to work, so we explicitly test for this.
+ *
+ * @since 5.2.0
+ *
+ * @return array The test results.
+ */
+ public function get_test_rest_availability() {
+ $result = array(
+ 'label' => __( 'The REST API is available', 'health-check' ),
+ 'status' => 'good',
+ 'badge' => array(
+ 'label' => __( 'Performance', 'health-check' ),
+ 'color' => 'blue',
+ ),
+ 'description' => sprintf(
+ '
%s
',
+ __( 'The REST API is one way WordPress, and other applications, communicate with the server. One example is the block editor screen, which relies on this to display, and save, your posts and pages.', 'health-check' )
+ ),
+ 'actions' => '',
+ 'test' => 'rest_availability',
+ );
+
+ $cookies = wp_unslash( $_COOKIE );
+ $timeout = 10;
+ $headers = array(
+ 'Cache-Control' => 'no-cache',
+ 'X-WP-Nonce' => wp_create_nonce( 'wp_rest' ),
+ );
+
+ // Include Basic auth in loopback requests.
+ if ( isset( $_SERVER['PHP_AUTH_USER'] ) && isset( $_SERVER['PHP_AUTH_PW'] ) ) {
+ $headers['Authorization'] = 'Basic ' . base64_encode( wp_unslash( $_SERVER['PHP_AUTH_USER'] ) . ':' . wp_unslash( $_SERVER['PHP_AUTH_PW'] ) );
+ }
+
+ $url = rest_url( 'wp/v2/types/post' );
+
+ // The context for this is editing with the new block editor.
+ $url = add_query_arg(
+ array(
+ 'context' => 'edit',
+ ),
+ $url
+ );
+
+ $r = wp_remote_get( $url, compact( 'cookies', 'headers', 'timeout' ) );
+
+ if ( is_wp_error( $r ) ) {
+ $result['status'] = 'critical';
+
+ $result['label'] = __( 'The REST API encountered an error', 'health-check' );
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ sprintf(
+ '%s %s',
+ __( 'The REST API request failed due to an error.', 'health-check' ),
+ sprintf(
+ /* translators: 1: The HTTP response code. 2: The error message returned. */
+ __( 'Error: [%1$s] %2$s', 'health-check' ),
+ wp_remote_retrieve_response_code( $r ),
+ $r->get_error_message()
+ )
+ )
+ );
+ } elseif ( 200 !== wp_remote_retrieve_response_code( $r ) ) {
+ $result['status'] = 'recommended';
+
+ $result['label'] = __( 'The REST API encountered an unexpected result', 'health-check' );
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: 1: The HTTP response code returned. 2: The error message returned. */
+ __( 'The REST API call gave the following unexpected result: (%1$d) %2$s.', 'health-check' ),
+ wp_remote_retrieve_response_code( $r ),
+ wp_remote_retrieve_body( $r )
+ )
+ );
+ } else {
+ $json = json_decode( wp_remote_retrieve_body( $r ), true );
+
+ if ( false !== $json && ! isset( $json['capabilities'] ) ) {
+ $result['status'] = 'recommended';
+
+ $result['label'] = __( 'The REST API did not behave correctly', 'health-check' );
+
+ $result['description'] .= sprintf(
+ '
%s
',
+ sprintf(
+ /* translators: %s: the name of the query parameter being tested. */
+ __( 'The REST API did not process the %s query parameter correctly.', 'health-check' ),
+ 'context'
+ )
+ );
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * Return a set of tests that belong to the site status page.
+ *
+ * Each site status test is defined here, they may be `direct` tests, that run on page load, or `async` tests
+ * which will run later down the line via JavaScript calls to improve page performance and hopefully also user
+ * experiences.
+ *
+ * @since 5.2.0
+ *
+ * @return array The list of tests to run.
+ */
+ public static function get_tests() {
+ global $health_check_site_status;
+
+ $tests = array(
+ 'direct' => array(
+ 'wordpress_version' => array(
+ 'label' => __( 'WordPress Version', 'health-check' ),
+ 'test' => array( $health_check_site_status, 'get_test_wordpress_version' ),
+ ),
+ 'plugin_version' => array(
+ 'label' => __( 'Plugin Versions', 'health-check' ),
+ 'test' => array( $health_check_site_status, 'get_test_plugin_version' ),
+ ),
+ 'theme_version' => array(
+ 'label' => __( 'Theme Versions', 'health-check' ),
+ 'test' => array( $health_check_site_status, 'get_test_theme_version' ),
+ ),
+ 'php_version' => array(
+ 'label' => __( 'PHP Version', 'health-check' ),
+ 'test' => array( $health_check_site_status, 'get_test_php_version' ),
+ ),
+ 'sql_server' => array(
+ 'label' => __( 'Database Server version', 'health-check' ),
+ 'test' => array( $health_check_site_status, 'get_test_sql_server' ),
+ ),
+ 'php_extensions' => array(
+ 'label' => __( 'PHP Extensions', 'health-check' ),
+ 'test' => array( $health_check_site_status, 'get_test_php_extensions' ),
+ ),
+ 'utf8mb4_support' => array(
+ 'label' => __( 'MySQL utf8mb4 support', 'health-check' ),
+ 'test' => array( $health_check_site_status, 'get_test_utf8mb4_support' ),
+ ),
+ 'https_status' => array(
+ 'label' => __( 'HTTPS status', 'health-check' ),
+ 'test' => array( $health_check_site_status, 'get_test_https_status' ),
+ ),
+ 'ssl_support' => array(
+ 'label' => __( 'Secure communication', 'health-check' ),
+ 'test' => array( $health_check_site_status, 'get_test_ssl_support' ),
+ ),
+ 'scheduled_events' => array(
+ 'label' => __( 'Scheduled events', 'health-check' ),
+ 'test' => array( $health_check_site_status, 'get_test_scheduled_events' ),
+ ),
+ 'http_requests' => array(
+ 'label' => __( 'HTTP Requests', 'health-check' ),
+ 'test' => array( $health_check_site_status, 'get_test_http_requests' ),
+ ),
+ 'debug_enabled' => array(
+ 'label' => __( 'Debugging enabled', 'health-check' ),
+ 'test' => array( $health_check_site_status, 'get_test_is_in_debug_mode' ),
+ ),
+ 'timezones' => array(
+ 'label' => __( 'Timezone', 'health-check' ),
+ 'test' => array( $health_check_site_status, 'get_test_timezone_not_utc' ),
+ ),
+ ),
+ 'async' => array(
+ 'dotorg_communication' => array(
+ 'label' => __( 'Communication with WordPress.org', 'health-check' ),
+ 'test' => 'dotorg_communication',
+ ),
+ 'background_updates' => array(
+ 'label' => __( 'Background updates', 'health-check' ),
+ 'test' => 'background_updates',
+ ),
+ 'loopback_requests' => array(
+ 'label' => __( 'Loopback request', 'health-check' ),
+ 'test' => 'loopback_requests',
+ ),
+ ),
+ );
+
+ // Conditionally include REST rules if the function for it exists.
+ if ( function_exists( 'rest_url' ) ) {
+ $tests['direct']['rest_availability'] = array(
+ 'label' => __( 'REST API availability', 'health-check' ),
+ 'test' => array( $health_check_site_status, 'get_test_rest_availability' ),
+ );
+ }
+
+ /**
+ * Add or modify which site status tests are run on a site.
+ *
+ * The site health is determined by a set of tests based on best practices from
+ * both the WordPress Hosting Team, but also web standards in general.
+ *
+ * Some sites may not have the same requirements, for example the automatic update
+ * checks may be handled by a host, and are therefore disabled in core.
+ * Or maybe you want to introduce a new test, is caching enabled/disabled/stale for example.
+ *
+ * Tests may be added either as direct, or asynchronous ones. Any test that may require some time
+ * to complete should run asynchronously, to avoid extended loading periods within wp-admin.
+ *
+ * @since 5.2.0
+ *
+ * @param array $test_type {
+ * An associative array, where the `$test_type` is either `direct` or
+ * `async`, to declare if the test should run via AJAX calls after page load.
+ *
+ * @type array $identifier {
+ * `$identifier` should be a unique identifier for the test that should run.
+ * Plugins and themes are encouraged to prefix test identifiers with their slug
+ * to avoid any collisions between tests.
+ *
+ * @type string $label A friendly label for your test to identify it by.
+ * @type mixed $test A callable to perform a direct test, or a string AJAX action to be called
+ * to perform an async test.
+ * }
+ * }
+ */
+ $tests = apply_filters( 'site_status_tests', $tests );
+
+ return $tests;
+ }
+
+ public function scheduled_check() {
+ // Bootstrap wp-admin, as WP_Cron doesn't do this for us.
+ require_once( trailingslashit( ABSPATH ) . 'wp-admin/includes/admin.php' );
+
+ $bulk_tests = Health_Check_Site_Status::get_tests();
+
+ $results = array();
+
+ $site_status = array(
+ 'good' => 0,
+ 'recommended' => 0,
+ 'critical' => 0,
+ );
+
+ $tests = array_merge( $bulk_tests['direct'], $bulk_tests['async'] );
+
+ foreach ( $tests as $test ) {
+ $function = sprintf(
+ 'get_test_%s',
+ $test['test']
+ );
+
+ if ( method_exists( $this, $function ) && is_callable( array( $this, $function ) ) ) {
+ $results[] = call_user_func( array( $this, $function ) );
+ } else {
+ $results[] = call_user_func( $test['test'] );
+ }
+ }
+
+ foreach ( $results as $result ) {
+ if ( 'critical' === $result['status'] ) {
+ $site_status['critical']++;
+ } elseif ( 'recommended' === $result['status'] ) {
+ $site_status['recommended']++;
+ } else {
+ $site_status['good']++;
+ }
+ }
+
+ set_transient( 'health-check-site-status-result', json_encode( $site_status ) );
+ }
+}
+
+global $health_check_site_status;
+$health_check_site_status = new Health_Check_Site_Status();
diff --git a/wp-content/plugins/health-check/includes/class-health-check-troubleshoot.php b/wp-content/plugins/health-check/includes/class-health-check-troubleshoot.php
new file mode 100644
index 000000000..e130fdbb8
--- /dev/null
+++ b/wp-content/plugins/health-check/includes/class-health-check-troubleshoot.php
@@ -0,0 +1,266 @@
+mkdir( WPMU_PLUGIN_DIR ) ) {
+ Health_Check::display_notice( esc_html__( 'We were unable to create the mu-plugins directory.', 'health-check' ), 'error' );
+ return false;
+ }
+ }
+
+ // Remove instances of the old plugin, to avoid collisions.
+ if ( Health_Check_Troubleshoot::old_mu_plugin_exists() ) {
+ if ( ! $wp_filesystem->delete( trailingslashit( WPMU_PLUGIN_DIR ) . 'health-check-disable-plugins.php' ) ) {
+ Health_Check::display_notice( esc_html__( 'We could not remove the old must-use plugin.', 'health-check' ), 'error' );
+ return false;
+ }
+ }
+
+ // Copy the must-use plugin to the local directory.
+ if ( ! $wp_filesystem->copy( trailingslashit( HEALTH_CHECK_PLUGIN_DIRECTORY ) . 'assets/mu-plugin/health-check-troubleshooting-mode.php', trailingslashit( WPMU_PLUGIN_DIR ) . 'health-check-troubleshooting-mode.php' ) ) {
+ Health_Check::display_notice( esc_html__( 'We were unable to copy the plugin file required to enable the Troubleshooting Mode.', 'health-check' ), 'error' );
+ return false;
+ }
+
+ if ( $redirect ) {
+ Health_Check_Troubleshoot::session_started();
+ }
+
+ return true;
+ }
+
+ /**
+ * Check if our Must-Use plugin needs updating, and do so if necessary.
+ *
+ * @global $wp_filesystem
+ *
+ * @uses Health_Check_Troubleshoot::mu_plugin_exists()
+ * @uses Health_Check::get_filesystem_credentials()
+ * @uses get_plugin_data()
+ * @uses trailingslashit()
+ * @uses version_compare()
+ * @uses WP_Filesystem::copy()
+ * @uses esc_html__()
+ *
+ * @return bool
+ */
+ static function maybe_update_must_use_plugin() {
+ if ( ! Health_Check_Troubleshoot::mu_plugin_exists() ) {
+ return false;
+ }
+ if ( ! Health_Check::get_filesystem_credentials() ) {
+ return false;
+ }
+
+ $current = get_plugin_data( trailingslashit( HEALTH_CHECK_PLUGIN_DIRECTORY ) . 'assets/mu-plugin/health-check-troubleshooting-mode.php' );
+ $active = get_plugin_data( trailingslashit( WPMU_PLUGIN_DIR ) . 'health-check-troubleshooting-mode.php' );
+
+ $current_version = ( isset( $current['Version'] ) ? $current['Version'] : '0.0' );
+ $active_version = ( isset( $active['Version'] ) ? $active['Version'] : '0.0' );
+
+ if ( version_compare( $current_version, $active_version, '>' ) ) {
+ global $wp_filesystem;
+
+ if ( ! $wp_filesystem->copy( trailingslashit( HEALTH_CHECK_PLUGIN_DIRECTORY ) . 'assets/mu-plugin/health-check-troubleshooting-mode.php', trailingslashit( WPMU_PLUGIN_DIR ) . 'health-check-troubleshooting-mode.php', true ) ) {
+ Health_Check::display_notice( esc_html__( 'We were unable to replace the plugin file required to enable the Troubleshooting Mode.', 'health-check' ), 'error' );
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Output a notice if our Troubleshooting Mode has been initiated.
+ *
+ * @uses Health_Check::display_notice()
+ * @uses sprintf()
+ * @uses esc_html__()
+ * @uses esc_url()
+ * @uses admin_url()
+ *
+ * @return void
+ */
+ static function session_started() {
+ Health_Check::display_notice(
+ sprintf(
+ '%s %s',
+ esc_html__( 'You have successfully enabled Troubleshooting Mode, all plugins will appear inactive until you disable Troubleshooting Mode, or log out and back in again.', 'health-check' ),
+ sprintf(
+ '%2$s',
+ esc_url( admin_url( '/' ) ),
+ esc_html__( 'Return to the Dashboard', 'health-check' )
+ )
+ )
+ );
+ }
+
+ /**
+ * Display the form for enabling troubleshooting mode.
+ *
+ * @uses printf()
+ * @uses esc_html__()
+ * @uses Health_Check_Troubleshoot::mu_plugin_exists()
+ * @uses Health_Check_Troubleshoot::maybe_update_must_use_plugin()
+ * @uses Health_Check_Troubleshoot::session_started()
+ * @uses Health_Check::get_filesystem_credentials()
+ * @uses Health_Check_Troubleshoot::setup_must_use_plugin()
+ * @uses esc_html_e()
+ *
+ * @return void
+ */
+
+ /**
+ * Display the form for enabling troubleshooting mode.
+ *
+ * @uses printf()
+ * @uses esc_html__()
+ * @uses Health_Check_Troubleshoot::mu_plugin_exists()
+ * @uses Health_Check_Troubleshoot::maybe_update_must_use_plugin()
+ * @uses Health_Check_Troubleshoot::session_started()
+ * @uses Health_Check::get_filesystem_credentials()
+ * @uses Health_Check_Troubleshoot::setup_must_use_plugin()
+ * @uses Health_Check_Troubleshooting_MU::is_troubleshooting()
+ * @uses esc_url()
+ * @uses add_query_arg()
+ * @uses esc_html_e()
+ *
+ * @return void
+ */
+ static function show_enable_troubleshoot_form() {
+ if ( isset( $_POST['health-check-troubleshoot-mode'] ) ) {
+ if ( Health_Check_Troubleshoot::mu_plugin_exists() ) {
+ if ( ! Health_Check_Troubleshoot::maybe_update_must_use_plugin() ) {
+ return;
+ }
+ Health_Check_Troubleshoot::session_started();
+ } else {
+ if ( ! Health_Check::get_filesystem_credentials() ) {
+ return;
+ } else {
+ Health_Check_Troubleshoot::setup_must_use_plugin();
+ }
+ }
+ }
+
+ ?>
+
+
+ init();
+ }
+
+ /**
+ * Initiate the plugin class.
+ *
+ * @return void
+ */
+ public function init() {
+ $this->plugins_before = (array) array();
+ $this->plugins_after = (array) array();
+ self::$plugins_blocked = (bool) false;
+
+ $this->themes_before = (array) array();
+ $this->themes_after = (array) array();
+ self::$themes_blocked = (bool) false;
+ }
+
+ /**
+ * Run tests to determine if auto-updates can run.
+ *
+ * @uses get_class_methods()
+ * @uses substr()
+ * @uses call_user_func()
+ *
+ * @return array
+ */
+ public function run_tests() {
+ $tests = array();
+
+ foreach ( get_class_methods( $this ) as $method ) {
+ if ( 'test_' !== substr( $method, 0, 5 ) ) {
+ continue;
+ }
+
+ $result = call_user_func( array( $this, $method ) );
+
+ if ( false === $result || null === $result ) {
+ continue;
+ }
+
+ $result = (object) $result;
+
+ if ( empty( $result->severity ) ) {
+ $result->severity = 'warning';
+ }
+
+ $tests[ $method ] = $result;
+ }
+
+ return $tests;
+ }
+
+ /**
+ * Check if plugin updates have been tampered with.
+ *
+ * @uses Health_Check_Updates::check_plugin_update_hooks()
+ * @uses esc_html__()
+ * @uses Health_Check_Updates::check_plugin_update_pre_request()
+ * @uses Health_Check_Updates::check_plugin_update_request_args()
+ *
+ * @return array
+ */
+ function test_plugin_updates() {
+ // Check if any update hooks have been removed.
+ $hooks = $this->check_plugin_update_hooks();
+ if ( ! $hooks ) {
+ return array(
+ 'desc' => esc_html__( 'Plugin update hooks have been removed.', 'health-check' ),
+ 'severity' => 'fail',
+ );
+ }
+
+ // Check if update requests are being blocked.
+ $blocked = $this->check_plugin_update_pre_request();
+ if ( true === $blocked ) {
+ return array(
+ 'desc' => esc_html__( 'Plugin update requests have been blocked.', 'health-check' ),
+ 'severity' => 'fail',
+ );
+ }
+
+ // Check if plugins have been removed from the update requests.
+ $diff = (array) $this->check_plugin_update_request_args();
+ if ( 0 !== count( $diff ) ) {
+ return array(
+ 'desc' => sprintf(
+ /* translators: %s: List of plugin names. */
+ esc_html__( 'The following Plugins have been removed from update checks: %s.', 'health-check' ),
+ implode( ',', $diff )
+ ),
+ 'severity' => 'warning',
+ );
+ }
+
+ return array(
+ 'desc' => esc_html__( 'Plugin updates should be working as expected.', 'health-check' ),
+ 'severity' => 'pass',
+ );
+ }
+
+ /**
+ * Check if any plugin update hooks have been removed.
+ *
+ * @uses has_filter()
+ * @uses wp_next_scheduled()
+ *
+ * @return array
+ */
+ function check_plugin_update_hooks() {
+ $test1 = has_filter( 'load-plugins.php', 'wp_update_plugins' );
+ $test2 = has_filter( 'load-update.php', 'wp_update_plugins' );
+ $test3 = has_filter( 'load-update-core.php', 'wp_update_plugins' );
+ $test4 = has_filter( 'wp_update_plugins', 'wp_update_plugins' );
+ $test5 = has_filter( 'admin_init', '_maybe_update_plugins' );
+ $test6 = wp_next_scheduled( 'wp_update_plugins' );
+
+ return $test1 && $test2 && $test3 && $test4 && $test5 && $test6;
+ }
+
+ /**
+ * Check if plugin update request checks are being tampered with at the 'pre_http_request' filter.
+ *
+ * @uses add_action()
+ * @uses Health_Check_Updates::wp_plugin_update_fake_request()
+ * @uses esc_html__()
+ *
+ * @return array
+ */
+ function check_plugin_update_pre_request() {
+ add_action( 'pre_http_request', array( $this, 'plugin_pre_request_check' ), PHP_INT_MAX, 3 );
+ add_action( 'pre_http_request', array( $this, 'block_fake_request' ), PHP_INT_MAX, 3 );
+
+ $this->plugin_update_fake_request();
+
+ remove_action( 'pre_http_request', array( $this, 'plugin_pre_request_check' ), PHP_INT_MAX );
+ remove_action( 'pre_http_request', array( $this, 'block_fake_request' ), PHP_INT_MAX );
+
+ return self::$plugins_blocked;
+ }
+
+ /**
+ * Check plugin update requests to see if they are being blocked.
+ *
+ * @param bool $pre If not false, request cancelled.
+ * @param array $r Request parameters.
+ * @param string $url Request URL.
+ * @return bool
+ */
+ function plugin_pre_request_check( $pre, $r, $url ) {
+ $check_url = 'api.wordpress.org/plugins/update-check/1.1/';
+ if ( 0 !== substr_compare( $url, $check_url, -strlen( $check_url ) ) ) {
+ return $pre; // Not a plugin update request.
+ }
+
+ // If not false something is blocking update checks
+ if ( false !== $pre ) {
+ self::$plugins_blocked = (bool) true;
+ }
+
+ return $pre;
+ }
+
+ /**
+ * Check if plugins are being removed at the 'http_request_args' filter.
+ *
+ * @uses add_action()
+ * @uses Health_Check_Updates::wp_plugin_update_fake_request()
+ * @uses remove_action()
+ *
+ * @return array
+ */
+ function check_plugin_update_request_args() {
+ add_action( 'http_request_args', array( $this, 'plugin_request_args_before' ), 1, 2 );
+ add_action( 'http_request_args', array( $this, 'plugin_request_args_after' ), PHP_INT_MAX, 2 );
+ add_action( 'pre_http_request', array( $this, 'block_fake_request' ), PHP_INT_MAX, 3 );
+
+ $this->plugin_update_fake_request();
+
+ remove_action( 'http_request_args', array( $this, 'plugin_request_args_before' ), 1 );
+ remove_action( 'http_request_args', array( $this, 'plugin_request_args_after' ), PHP_INT_MAX );
+ remove_action( 'pre_http_request', array( $this, 'block_fake_request' ), PHP_INT_MAX );
+
+ $diff = array_diff_key( $this->plugins_before['plugins'], $this->plugins_after['plugins'] );
+
+ $titles = array();
+ foreach ( $diff as $item ) {
+ $titles[] = $item['Title'];
+ }
+
+ return $titles;
+ }
+
+ /**
+ * Record the list of plugins from plugin update requests at the start of filtering.
+ *
+ * @param array $r Request parameters.
+ * @param string $url Request URL.
+ * @return array
+ */
+ function plugin_request_args_before( $r, $url ) {
+ $check_url = 'api.wordpress.org/plugins/update-check/1.1/';
+ if ( 0 !== substr_compare( $url, $check_url, -strlen( $check_url ) ) ) {
+ return $r; // Not a plugin update request.
+ }
+
+ $this->plugins_before = (array) json_decode( $r['body']['plugins'], true );
+
+ return $r;
+ }
+
+ /**
+ * Record the list of plugins from plugin update requests at the end of filtering.
+ *
+ * @param array $r Request parameters.
+ * @param string $url Request URL.
+ * @return array
+ */
+ function plugin_request_args_after( $r, $url ) {
+ $check_url = 'api.wordpress.org/plugins/update-check/1.1/';
+ if ( 0 !== substr_compare( $url, $check_url, -strlen( $check_url ) ) ) {
+ return $r; // Not a plugin update request.
+ }
+
+ $this->plugins_after = (array) json_decode( $r['body']['plugins'], true );
+
+ return $r;
+ }
+
+ /**
+ * Create and trigger a fake plugin update check request.
+ *
+ * @uses get_plugins()
+ * @uses get_option()
+ * @uses wp_get_installed_translations()
+ * @uses apply_filters()
+ * @uses wp_json_encode()
+ * @uses get_bloginfo()
+ * @uses home_url()
+ * @uses wp_http_supports()
+ * @uses set_url_scheme()
+ * @uses wp_remote_post()
+ *
+ * @return void
+ */
+ function plugin_update_fake_request() {
+ if ( ! function_exists( 'get_plugins' ) ) {
+ require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
+ }
+
+ // Prepare data for the request.
+ $plugins = get_plugins();
+ $active = get_option( 'active_plugins', array() );
+ $to_send = compact( 'plugins', 'active' );
+ $translations = wp_get_installed_translations( 'plugins' );
+ $locales = array_values( get_available_languages() );
+ $locales = (array) apply_filters( 'plugins_update_check_locales', $locales );
+ $locales = array_unique( $locales );
+ $timeout = 3 + (int) ( count( $plugins ) / 10 );
+
+ // Setup the request options.
+ if ( function_exists( 'wp_json_encode' ) ) {
+ $options = array(
+ 'timeout' => $timeout,
+ 'body' => array(
+ 'plugins' => wp_json_encode( $to_send ),
+ 'translations' => wp_json_encode( $translations ),
+ 'locale' => wp_json_encode( $locales ),
+ 'all' => wp_json_encode( true ),
+ ),
+ 'user-agent' => 'WordPress/' . get_bloginfo( 'version' ) . '; ' . home_url( '/' ),
+ );
+ } else {
+ $options = array(
+ 'timeout' => $timeout,
+ 'body' => array(
+ 'plugins' => json_encode( $to_send ),
+ 'translations' => json_encode( $translations ),
+ 'locale' => json_encode( $locales ),
+ 'all' => json_encode( true ),
+ ),
+ 'user-agent' => 'WordPress/' . get_bloginfo( 'version' ) . '; ' . home_url( '/' ),
+ );
+ }
+
+ // Set the URL
+ $http_url = 'http://api.wordpress.org/plugins/update-check/1.1/';
+ $url = wp_http_supports( array( 'ssl' ) ) ? set_url_scheme( $http_url, 'https' ) : $http_url;
+
+ // Ignore the response. Just need the hooks to fire.
+ wp_remote_post( $url, $options );
+ }
+
+ /**
+ * Check if theme updates have been tampered with.
+ *
+ * @uses Health_Check_Updates::check_theme_update_hooks()
+ * @uses esc_html__()
+ * @uses Health_Check_Updates::check_theme_update_pre_request()
+ * @uses Health_Check_Updates::check_theme_update_request_args()
+ *
+ * @return array
+ */
+ function test_constant_theme_updates() {
+ // Check if any update hooks have been removed.
+ $hooks = $this->check_theme_update_hooks();
+ if ( ! $hooks ) {
+ return array(
+ 'desc' => esc_html__( 'Theme update hooks have been removed.', 'health-check' ),
+ 'severity' => 'fail',
+ );
+ }
+
+ // Check if update requests are being blocked.
+ $blocked = $this->check_theme_update_pre_request();
+ if ( true === $blocked ) {
+ return array(
+ 'desc' => esc_html__( 'Theme update requests have been blocked.', 'health-check' ),
+ 'severity' => 'fail',
+ );
+ }
+
+ // Check if themes have been removed from the update requests.
+ $diff = (array) $this->check_theme_update_request_args();
+ if ( 0 !== count( $diff ) ) {
+ return array(
+ 'desc' => sprintf(
+ /* translators: %s: List of theme names. */
+ esc_html__( 'The following Themes have been removed from update checks: %s.', 'health-check' ),
+ implode( ',', $diff )
+ ),
+ 'severity' => 'warning',
+ );
+ }
+
+ return array(
+ 'desc' => esc_html__( 'Theme updates should be working as expected.', 'health-check' ),
+ 'severity' => 'pass',
+ );
+ }
+
+ /**
+ * Check if any theme update hooks have been removed.
+ *
+ * @uses has_filter()
+ * @uses wp_next_scheduled()
+ *
+ * @return array
+ */
+ function check_theme_update_hooks() {
+ $test1 = has_filter( 'load-themes.php', 'wp_update_themes' );
+ $test2 = has_filter( 'load-update.php', 'wp_update_themes' );
+ $test3 = has_filter( 'load-update-core.php', 'wp_update_themes' );
+ $test4 = has_filter( 'wp_update_themes', 'wp_update_themes' );
+ $test5 = has_filter( 'admin_init', '_maybe_update_themes' );
+ $test6 = wp_next_scheduled( 'wp_update_themes' );
+
+ return $test1 && $test2 && $test3 && $test4 && $test5 && $test6;
+ }
+
+ /**
+ * Check if theme update request checks are being tampered with at the 'pre_http_request' filter.
+ *
+ * @uses add_action()
+ * @uses Health_Check_Updates::wp_theme_update_fake_request()
+ * @uses esc_html__()
+ *
+ * @return array
+ */
+ function check_theme_update_pre_request() {
+ add_action( 'pre_http_request', array( $this, 'theme_pre_request_check' ), PHP_INT_MAX, 3 );
+ add_action( 'pre_http_request', array( $this, 'block_fake_request' ), PHP_INT_MAX, 3 );
+
+ $this->theme_update_fake_request();
+
+ remove_action( 'pre_http_request', array( $this, 'theme_pre_request_check' ), PHP_INT_MAX );
+ remove_action( 'pre_http_request', array( $this, 'block_fake_request' ), PHP_INT_MAX );
+
+ return self::$themes_blocked;
+ }
+
+ /**
+ * Check theme update requests to see if they are being blocked.
+ *
+ * @param bool $pre If not false, request cancelled.
+ * @param array $r Request parameters.
+ * @param string $url Request URL.
+ * @return bool
+ */
+ function theme_pre_request_check( $pre, $r, $url ) {
+ $check_url = 'api.wordpress.org/themes/update-check/1.1/';
+ if ( 0 !== substr_compare( $url, $check_url, -strlen( $check_url ) ) ) {
+ return $pre; // Not a theme update request.
+ }
+
+ // If not false something is blocking update checks
+ if ( false !== $pre ) {
+ self::$themes_blocked = (bool) true;
+ }
+
+ return $pre;
+ }
+
+ /**
+ * Check if themes are being removed at the 'http_request_args' filter.
+ *
+ * @uses add_action()
+ * @uses Health_Check_Updates::wp_theme_update_fake_request()
+ * @uses remove_action()
+ *
+ * @return array
+ */
+ function check_theme_update_request_args() {
+ add_action( 'http_request_args', array( $this, 'theme_request_args_before' ), 1, 2 );
+ add_action( 'http_request_args', array( $this, 'theme_request_args_after' ), PHP_INT_MAX, 2 );
+ add_action( 'pre_http_request', array( $this, 'block_fake_request' ), PHP_INT_MAX, 3 );
+
+ $this->theme_update_fake_request();
+
+ remove_action( 'http_request_args', array( $this, 'theme_request_args_before' ), 1 );
+ remove_action( 'http_request_args', array( $this, 'theme_request_args_after' ), PHP_INT_MAX );
+ remove_action( 'pre_http_request', array( $this, 'block_fake_request' ), PHP_INT_MAX );
+
+ $diff = array_diff_key( $this->themes_before['themes'], $this->themes_after['themes'] );
+
+ $titles = array();
+ foreach ( $diff as $item ) {
+ $titles[] = $item['Title'];
+ }
+
+ return $titles;
+ }
+
+ /**
+ * Record the list of themes from theme update requests at the start of filtering.
+ *
+ * @param array $r Request parameters.
+ * @param string $url Request URL.
+ * @return array
+ */
+ function theme_request_args_before( $r, $url ) {
+ $check_url = 'api.wordpress.org/themes/update-check/1.1/';
+ if ( 0 !== substr_compare( $url, $check_url, -strlen( $check_url ) ) ) {
+ return $r; // Not a theme update request.
+ }
+
+ $this->themes_before = (array) json_decode( $r['body']['themes'], true );
+
+ return $r;
+ }
+
+ /**
+ * Record the list of themes from theme update requests at the end of filtering.
+ *
+ * @param array $r Request parameters.
+ * @param string $url Request URL.
+ * @return array
+ */
+ function theme_request_args_after( $r, $url ) {
+ $check_url = 'api.wordpress.org/themes/update-check/1.1/';
+ if ( 0 !== substr_compare( $url, $check_url, -strlen( $check_url ) ) ) {
+ return $r; // Not a theme update request.
+ }
+
+ $this->themes_after = (array) json_decode( $r['body']['themes'], true );
+
+ return $r;
+ }
+
+ /**
+ * Create and trigger a fake theme update check request.
+ *
+ * @uses wp_get_themes()
+ * @uses wp_get_installed_translations()
+ * @uses get_option()
+ * @uses get_available_languages()
+ * @uses wp_json_encode()
+ * @uses get_bloginfo()
+ * @uses home_url()
+ * @uses wp_http_supports()
+ * @uses set_url_scheme()
+ * @uses wp_remote_post()
+ *
+ * @return void
+ */
+ function theme_update_fake_request() {
+ $themes = array();
+ $checked = array();
+ $request = array();
+ $installed_themes = wp_get_themes();
+ $translations = wp_get_installed_translations( 'themes' );
+ $request['active'] = get_option( 'stylesheet' );
+
+ foreach ( $installed_themes as $theme ) {
+ $checked[ $theme->get_stylesheet() ] = $theme->get( 'Version' );
+
+ $themes[ $theme->get_stylesheet() ] = array(
+ 'Name' => $theme->get( 'Name' ),
+ 'Title' => $theme->get( 'Name' ),
+ 'Version' => $theme->get( 'Version' ),
+ 'Author' => $theme->get( 'Author' ),
+ 'Author URI' => $theme->get( 'AuthorURI' ),
+ 'Template' => $theme->get_template(),
+ 'Stylesheet' => $theme->get_stylesheet(),
+ );
+ }
+
+ $request['themes'] = $themes;
+
+ $locales = array_values( get_available_languages() );
+ $timeout = 3 + (int) ( count( $themes ) / 10 );
+
+ if ( function_exists( 'wp_json_encode' ) ) {
+ $options = array(
+ 'timeout' => $timeout,
+ 'body' => array(
+ 'themes' => wp_json_encode( $request ),
+ 'translations' => wp_json_encode( $translations ),
+ 'locale' => wp_json_encode( $locales ),
+ ),
+ 'user-agent' => 'WordPress/' . get_bloginfo( 'version' ) . '; ' . home_url( '/' ),
+ );
+ } else {
+ $options = array(
+ 'timeout' => $timeout,
+ 'body' => array(
+ 'themes' => json_encode( $request ),
+ 'translations' => json_encode( $translations ),
+ 'locale' => json_encode( $locales ),
+ ),
+ 'user-agent' => 'WordPress/' . get_bloginfo( 'version' ) . '; ' . home_url( '/' ),
+ );
+ }
+
+ // Set the URL
+ $http_url = 'http://api.wordpress.org/themes/update-check/1.1/';
+ $url = wp_http_supports( array( 'ssl' ) ) ? set_url_scheme( $http_url, 'https' ) : $http_url;
+
+ // Ignore the response. Just need the hooks to fire.
+ wp_remote_post( $url, $options );
+ }
+
+ /**
+ * Blocks the fake update requests, ensuring they do not slow down page loads.
+ *
+ * @param bool $pre If not false, request cancelled.
+ * @param array $r Request parameters.
+ * @param string $url Request URL.
+ * @return bool
+ */
+ function block_fake_request( $pre, $r, $url ) {
+ switch ( $url ) {
+ case 'https://api.wordpress.org/plugins/update-check/1.1/':
+ return 'block_request';
+ case 'https://api.wordpress.org/themes/update-check/1.1/':
+ return 'block_request';
+ default:
+ return $pre;
+ }
+ }
+}
diff --git a/wp-content/plugins/health-check/includes/class-health-check-wp-cli.php b/wp-content/plugins/health-check/includes/class-health-check-wp-cli.php
new file mode 100644
index 000000000..4ab554a2b
--- /dev/null
+++ b/wp-content/plugins/health-check/includes/class-health-check-wp-cli.php
@@ -0,0 +1,77 @@
+]
+ * : Render the output in a particular format.
+ * ---
+ * default: table
+ * options:
+ * - table
+ * - csv
+ * - json
+ * - yaml
+ * ---
+ */
+ public function status( $args, $assoc_args ) {
+ global $health_check_site_status;
+
+ $all_tests = $health_check_site_status::get_tests();
+
+ $test_result = array();
+
+ foreach ( $all_tests['direct'] as $test ) {
+ $test_output = call_user_func( $test['test'] );
+
+ $test_result[] = array(
+ 'test' => $test['label'],
+ 'type' => wp_kses( $test_output['badge']['label'], array() ),
+ 'result' => wp_kses( $test_output['status'], array() ),
+ );
+ }
+ foreach ( $all_tests['async'] as $test ) {
+ $test_output = call_user_func( array( $health_check_site_status, 'get_test_' . $test['test'] ) );
+
+ $test_result[] = array(
+ 'test' => $test['label'],
+ 'type' => wp_kses( $test_output['badge']['label'], array() ),
+ 'result' => wp_kses( $test_output['status'], array() ),
+ );
+ }
+
+ if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'format' ) === 'json' ) {
+ WP_CLI\Utils\format_items( 'json', $test_result, array( 'test', 'type', 'result' ) );
+ } elseif ( WP_CLI\Utils\get_flag_value( $assoc_args, 'format' ) === 'csv' ) {
+ WP_CLI\Utils\format_items( 'csv', $test_result, array( 'test', 'type', 'result' ) );
+ } elseif ( WP_CLI\Utils\get_flag_value( $assoc_args, 'format' ) === 'yaml' ) {
+ WP_CLI\Utils\format_items( 'yaml', $test_result, array( 'test', 'type', 'result' ) );
+ } else {
+ WP_CLI\Utils\format_items( 'table', $test_result, array( 'test', 'type', 'result' ) );
+ }
+ }
+}
+
+WP_CLI::add_command( 'health-check', 'Health_Check_WP_CLI' );
diff --git a/wp-content/plugins/health-check/includes/class-health-check-wp-cron.php b/wp-content/plugins/health-check/includes/class-health-check-wp-cron.php
new file mode 100644
index 000000000..d47b9f328
--- /dev/null
+++ b/wp-content/plugins/health-check/includes/class-health-check-wp-cron.php
@@ -0,0 +1,143 @@
+init();
+
+ $this->timeout_late_cron = 0;
+ $this->timeout_missed_cron = - 5 * MINUTE_IN_SECONDS;
+
+ if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) {
+ $this->timeout_late_cron = - 15 * MINUTE_IN_SECONDS;
+ $this->timeout_missed_cron = - 1 * HOUR_IN_SECONDS;
+ }
+ }
+
+ /**
+ * Initiate the class
+ *
+ * @uses wp_get_schedules()
+ * @uses Health_Check_WP_Cron::get_cron_tasks()
+ *
+ * @return void
+ */
+ public function init() {
+ $this->schedules = wp_get_schedules();
+ $this->get_cron_tasks();
+ }
+
+ /**
+ * Populate our list of cron events and store them to a class-wide variable.
+ *
+ * Derived from `get_cron_events()` in WP Crontrol (https://plugins.svn.wordpress.org/wp-crontrol)
+ * by John Blackburn.
+ *
+ * @uses _get_cron_array()
+ * @uses WP_Error
+ *
+ * @return void
+ */
+ private function get_cron_tasks() {
+ $cron_tasks = _get_cron_array();
+
+ if ( empty( $cron_tasks ) ) {
+ $this->crons = new WP_Error( 'no_tasks', __( 'No scheduled events exist on this site.', 'health-check' ) );
+ return;
+ }
+
+ $this->crons = array();
+
+ foreach ( $cron_tasks as $time => $cron ) {
+ foreach ( $cron as $hook => $dings ) {
+ foreach ( $dings as $sig => $data ) {
+
+ $this->crons[ "$hook-$sig-$time" ] = (object) array(
+ 'hook' => $hook,
+ 'time' => $time,
+ 'sig' => $sig,
+ 'args' => $data['args'],
+ 'schedule' => $data['schedule'],
+ 'interval' => isset( $data['interval'] ) ? $data['interval'] : null,
+ );
+
+ }
+ }
+ }
+ }
+
+ /**
+ * Check if any scheduled tasks have been missed.
+ *
+ * Returns a boolean value of `true` if a scheduled task has been missed and ends processing.
+ * If the list of crons is an instance of WP_Error, return the instance instead of a boolean value.
+ *
+ * @uses is_wp_error()
+ * @uses time()
+ *
+ * @return bool|WP_Error
+ */
+ public function has_missed_cron() {
+ if ( is_wp_error( $this->crons ) ) {
+ return $this->crons;
+ }
+
+ foreach ( $this->crons as $id => $cron ) {
+ if ( ( $cron->time - time() ) < $this->timeout_missed_cron ) {
+ $this->last_missed_cron = $cron->hook;
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Check if any scheduled tasks are late.
+ *
+ * Returns a boolean value of `true` if a scheduled task is late and ends processing. If the list of
+ * crons is an instance of WP_Error, return the instance instead of a boolean value.
+ *
+ * @return bool|WP_Error true if a cron is late, false if it wasn't. WP_Error if the cron is set to that.
+ */
+ public function has_late_cron() {
+ if ( is_wp_error( $this->crons ) ) {
+ return $this->crons;
+ }
+
+ foreach ( $this->crons as $id => $cron ) {
+ $cron_offset = $cron->time - time();
+ if (
+ $cron_offset >= $this->timeout_missed_cron &&
+ $cron_offset < $this->timeout_late_cron
+ ) {
+ $this->last_late_cron = $cron->hook;
+ return true;
+ }
+ }
+
+ return false;
+ }
+}
diff --git a/wp-content/plugins/health-check/includes/class-health-check.php b/wp-content/plugins/health-check/includes/class-health-check.php
new file mode 100644
index 000000000..96f0263c7
--- /dev/null
+++ b/wp-content/plugins/health-check/includes/class-health-check.php
@@ -0,0 +1,597 @@
+init();
+ }
+
+ /**
+ * Plugin initiation.
+ *
+ * A helper function, called by `HealthCheck::__construct()` to initiate actions, hooks and other features needed.
+ *
+ * @uses add_action()
+ * @uses add_filter()
+ *
+ * @return void
+ */
+ public function init() {
+ add_action( 'plugins_loaded', array( $this, 'load_i18n' ) );
+
+ add_action( 'admin_menu', array( $this, 'action_admin_menu' ) );
+
+ add_filter( 'plugin_action_links', array( $this, 'troubleshoot_plugin_action' ), 20, 4 );
+ add_filter( 'plugin_action_links_' . plugin_basename( HEALTH_CHECK_PLUGIN_FILE ), array( $this, 'page_plugin_action' ) );
+
+ add_action( 'admin_notices', array( $this, 'admin_notices' ) );
+
+ add_action( 'admin_enqueue_scripts', array( $this, 'enqueues' ) );
+
+ add_action( 'init', array( $this, 'start_troubleshoot_mode' ) );
+ add_action( 'load-plugins.php', array( $this, 'start_troubleshoot_single_plugin_mode' ) );
+
+ add_action( 'wp_ajax_health-check-loopback-no-plugins', array( 'Health_Check_Loopback', 'loopback_no_plugins' ) );
+ add_action( 'wp_ajax_health-check-loopback-individual-plugins', array( 'Health_Check_Loopback', 'loopback_test_individual_plugins' ) );
+ add_action( 'wp_ajax_health-check-loopback-default-theme', array( 'Health_Check_Loopback', 'loopback_test_default_theme' ) );
+ add_action( 'wp_ajax_health-check-get-sizes', array( 'Health_Check_Debug_Data', 'ajax_get_sizes' ) );
+
+ add_filter( 'cron_schedules', array( $this, 'cron_schedules' ) );
+
+ add_filter( 'user_has_cap', array( $this, 'maybe_grant_site_health_caps' ), 1, 4 );
+ }
+
+ /**
+ * Filters the user capabilities to grant the 'view_site_health_checks' capabilities as necessary.
+ *
+ * @since 5.2.2
+ *
+ * @param bool[] $allcaps An array of all the user's capabilities.
+ * @param string[] $caps Required primitive capabilities for the requested capability.
+ * @param array $args {
+ * Arguments that accompany the requested capability check.
+ *
+ * @type string $0 Requested capability.
+ * @type int $1 Concerned user ID.
+ * @type mixed ...$2 Optional second and further parameters, typically object ID.
+ * }
+ * @param WP_User $user The user object.
+ * @return bool[] Filtered array of the user's capabilities.
+ */
+ function maybe_grant_site_health_caps( $allcaps, $caps, $args, $user ) {
+ if ( ! empty( $allcaps['install_plugins'] ) && ( ! is_multisite() || is_super_admin( $user->ID ) ) ) {
+ $allcaps['view_site_health_checks'] = true;
+ }
+
+ return $allcaps;
+ }
+
+ /**
+ * Initiate troubleshooting mode.
+ *
+ * Catch when the troubleshooting form has been submitted, and appropriately set required options and cookies.
+ *
+ * @uses current_user_can()
+ * @uses Health_Check_Troubleshoot::initiate_troubleshooting_mode()
+ *
+ * @return void
+ */
+ public function start_troubleshoot_mode() {
+ if ( ! isset( $_POST['health-check-troubleshoot-mode'] ) || ! current_user_can( 'view_site_health_checks' ) ) {
+ return;
+ }
+
+ // Don't enable troubleshooting if nonces are missing or do not match.
+ if ( ! isset( $_POST['_wpnonce'] ) || ! wp_verify_nonce( $_POST['_wpnonce'], 'health-check-enable-troubleshooting' ) ) {
+ return;
+ }
+
+ Health_Check_Troubleshoot::initiate_troubleshooting_mode();
+ }
+
+ /**
+ * Initiate troubleshooting mode for a specific plugin.
+ *
+ * Catch when the troubleshooting link on an individual plugin has been clicked, and appropriately sets the
+ * required options and cookies.
+ *
+ * @uses current_user_can()
+ * @uses ob_start()
+ * @uses Health_Check_Troubleshoot::mu_plugin_exists()
+ * @uses Health_Check::get_filesystem_credentials()
+ * @uses Health_Check_Troubleshoot::setup_must_use_plugin()
+ * @uses Health_Check_Troubleshoot::maybe_update_must_use_plugin()
+ * @uses ob_get_clean()
+ * @uses Health_Check_Troubleshoot::initiate_troubleshooting_mode()
+ * @uses wp_redirect()
+ * @uses admin_url()
+ *
+ * @return void
+ */
+ public function start_troubleshoot_single_plugin_mode() {
+ if ( ! isset( $_GET['health-check-troubleshoot-plugin'] ) || ! current_user_can( 'view_site_health_checks' ) ) {
+ return;
+ }
+
+ // Don't enable troubleshooting for an individual plugin if the nonce is missing or invalid.
+ if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], 'health-check-troubleshoot-plugin-' . $_GET['health-check-troubleshoot-plugin'] ) ) {
+ return;
+ }
+
+ ob_start();
+
+ $needs_credentials = false;
+
+ if ( ! Health_Check_Troubleshoot::mu_plugin_exists() ) {
+ if ( ! Health_Check::get_filesystem_credentials() ) {
+ $needs_credentials = true;
+ } else {
+ $check_output = Health_Check_Troubleshoot::setup_must_use_plugin( false );
+ if ( false === $check_output ) {
+ $needs_credentials = true;
+ }
+ }
+ } else {
+ if ( ! Health_Check_Troubleshoot::maybe_update_must_use_plugin() ) {
+ $needs_credentials = true;
+ }
+ }
+
+ $result = ob_get_clean();
+
+ if ( $needs_credentials ) {
+ $this->admin_notices[] = (object) array(
+ 'message' => $result,
+ 'type' => 'warning',
+ );
+ return;
+ }
+
+ Health_Check_Troubleshoot::initiate_troubleshooting_mode(
+ array(
+ $_GET['health-check-troubleshoot-plugin'] => $_GET['health-check-troubleshoot-plugin'],
+ )
+ );
+
+ wp_redirect( admin_url( 'plugins.php' ) );
+ }
+
+ /**
+ * Load translations.
+ *
+ * Loads the textdomain needed to get translations for our plugin.
+ *
+ * @uses load_plugin_textdomain()
+ * @uses basename()
+ * @uses dirname()
+ *
+ * @return void
+ */
+ public function load_i18n() {
+ load_plugin_textdomain( 'health-check', false, basename( dirname( __FILE__ ) ) . '/languages/' );
+ }
+
+ /**
+ * Enqueue assets.
+ *
+ * Conditionally enqueue our CSS and JavaScript when viewing plugin related pages in wp-admin.
+ *
+ * @uses wp_enqueue_style()
+ * @uses plugins_url()
+ * @uses wp_enqueue_script()
+ * @uses wp_localize_script()
+ * @uses esc_html__()
+ *
+ * @return void
+ */
+ public function enqueues() {
+ $screen = get_current_screen();
+
+ // Don't enqueue anything unless we're on the health check page.
+ if ( ( ! isset( $_GET['page'] ) || 'health-check' !== $_GET['page'] ) && 'dashboard' !== $screen->base ) {
+ return;
+ }
+
+ $health_check_js_variables = array(
+ 'string' => array(
+ 'please_wait' => esc_html__( 'Please wait...', 'health-check' ),
+ 'copied' => esc_html__( 'Copied', 'health-check' ),
+ 'running_tests' => esc_html__( 'Currently being tested...', 'health-check' ),
+ 'site_health_complete' => esc_html__( 'All site health tests have finished running.', 'health-check' ),
+ 'site_health_complete_pass_sr' => esc_html__( 'All site health tests have finished running. Your site is looking good, and the results are now available on the page.', 'health-check' ),
+ 'site_health_complete_fail_sr' => esc_html__( 'All site health tests have finished running. There are items that should be addressed, and the results are now available on the page.', 'health-check' ),
+ 'site_health_complete_pass' => esc_html__( 'Good', 'health-check' ),
+ 'site_health_complete_fail' => esc_html__( 'Should be improved', 'health-check' ),
+ 'site_info_copied' => esc_html__( 'Site information has been added to your clipboard.', 'health-check' ),
+ // translators: %s: Amount of critical issues.
+ 'site_info_heading_critical_single' => esc_html__( '%s Critical issue', 'health-check' ),
+ // translators: %s: Amount of critical issues.
+ 'site_info_heading_critical_plural' => esc_html__( '%s Critical issues', 'health-check' ),
+ // translators: %s: Amount of recommended issues.
+ 'site_info_heading_recommended_single' => esc_html__( '%s Recommended improvement', 'health-check' ),
+ // translators: %s: Amount of recommended issues.
+ 'site_info_heading_recommended_plural' => esc_html__( '%s Recommended improvements', 'health-check' ),
+ // translators: %s: Amount of passed tests.
+ 'site_info_heading_good_single' => esc_html__( '%s Item with no issues detected', 'health-check' ),
+ // translators: %s: Amount of passed tests.
+ 'site_info_heading_good_plural' => esc_html__( '%s Items with no issues detected', 'health-check' ),
+ ),
+ 'nonce' => array(
+ 'loopback_no_plugins' => wp_create_nonce( 'health-check-loopback-no-plugins' ),
+ 'loopback_individual_plugins' => wp_create_nonce( 'health-check-loopback-individual-plugins' ),
+ 'loopback_default_theme' => wp_create_nonce( 'health-check-loopback-default-theme' ),
+ 'files_integrity_check' => wp_create_nonce( 'health-check-files-integrity-check' ),
+ 'view_file_diff' => wp_create_nonce( 'health-check-view-file-diff' ),
+ 'mail_check' => wp_create_nonce( 'health-check-mail-check' ),
+ 'site_status' => wp_create_nonce( 'health-check-site-status' ),
+ 'site_status_result' => wp_create_nonce( 'health-check-site-status-result' ),
+ 'tools_plugin_compat' => wp_create_nonce( 'health-check-tools-plugin-compat' ),
+ ),
+ 'site_status' => array(
+ 'direct' => array(),
+ 'async' => array(),
+ 'issues' => array(
+ 'good' => 0,
+ 'recommended' => 0,
+ 'critical' => 0,
+ ),
+ ),
+ );
+
+ $issue_counts = get_transient( 'health-check-site-status-result' );
+
+ if ( false !== $issue_counts ) {
+ $issue_counts = json_decode( $issue_counts );
+
+ $health_check_js_variables['site_status']['issues'] = $issue_counts;
+ }
+
+ if ( 'dashboard' !== $screen->base && ( ! isset( $_GET['tab'] ) || ( isset( $_GET['tab'] ) && 'site-status' === $_GET['tab'] ) ) ) {
+ $tests = Health_Check_Site_Status::get_tests();
+
+ // Don't run https test on localhost
+ if ( 'localhost' === preg_replace( '|https?://|', '', get_site_url() ) ) {
+ unset( $tests['direct']['https_status'] );
+ }
+
+ foreach ( $tests['direct'] as $test ) {
+ if ( is_string( $test['test'] ) ) {
+ $test_function = sprintf(
+ 'get_test_%s',
+ $test['test']
+ );
+
+ if ( method_exists( $this, $test_function ) && is_callable( array( $this, $test_function ) ) ) {
+ /**
+ * Filter the output of a finished Site Health test.
+ *
+ * @since 5.3.0
+ *
+ * @param array $test_result {
+ * An associated array of test result data.
+ *
+ * @param string $label A label describing the test, and is used as a header in the output.
+ * @param string $status The status of the test, which can be a value of `good`, `recommended` or `critical`.
+ * @param array $badge {
+ * Tests are put into categories which have an associated badge shown, these can be modified and assigned here.
+ *
+ * @param string $label The test label, for example `Performance`.
+ * @param string $color Default `blue`. A string representing a color to use for the label.
+ * }
+ * @param string $description A more descriptive explanation of what the test looks for, and why it is important for the end user.
+ * @param string $actions An action to direct the user to where they can resolve the issue, if one exists.
+ * @param string $test The name of the test being ran, used as a reference point.
+ * }
+ */
+ $health_check_js_variables['site_status']['direct'][] = apply_filters( 'site_status_test_result', call_user_func( array( $this, $test_function ) ) );
+ continue;
+ }
+ }
+
+ if ( is_callable( $test['test'] ) ) {
+ $health_check_js_variables['site_status']['direct'][] = apply_filters( 'site_status_test_result', call_user_func( $test['test'] ) );
+ }
+ }
+
+ foreach ( $tests['async'] as $test ) {
+ if ( is_string( $test['test'] ) ) {
+ $health_check_js_variables['site_status']['async'][] = array(
+ 'test' => $test['test'],
+ 'completed' => false,
+ );
+ }
+ }
+ }
+
+ if ( ! wp_script_is( 'clipboard', 'registered' ) ) {
+ wp_register_script( 'clipboard', trailingslashit( HEALTH_CHECK_PLUGIN_URL ) . 'assets/javascript/clipboard.min.js', array(), '2.0.4' );
+ }
+
+ wp_enqueue_style( 'health-check', trailingslashit( HEALTH_CHECK_PLUGIN_URL ) . 'assets/css/health-check.css', array(), HEALTH_CHECK_PLUGIN_VERSION );
+
+ wp_enqueue_script( 'health-check', trailingslashit( HEALTH_CHECK_PLUGIN_URL ) . 'assets/javascript/health-check.js', array( 'jquery', 'wp-a11y', 'clipboard', 'wp-util' ), HEALTH_CHECK_PLUGIN_VERSION, true );
+
+ wp_localize_script( 'health-check', 'SiteHealth', $health_check_js_variables );
+ }
+
+ /**
+ * Add item to the admin menu.
+ *
+ * @uses add_dashboard_page()
+ * @uses __()
+ *
+ * @return void
+ */
+ public function action_admin_menu() {
+ $critical_issues = 0;
+ $issue_counts = get_transient( 'health-check-site-status-result' );
+
+ if ( false !== $issue_counts ) {
+ $issue_counts = json_decode( $issue_counts );
+
+ $critical_issues = absint( $issue_counts->critical );
+ }
+
+ $critical_count = sprintf(
+ '%s',
+ esc_attr( $critical_issues ),
+ sprintf(
+ '%d %s',
+ esc_html( $critical_issues ),
+ esc_html_x( 'Critical issues', 'Issue counter label for the admin menu', 'health-check' )
+ )
+ );
+
+ $menu_title =
+ sprintf(
+ // translators: %s: Critical issue counter, if any.
+ _x( 'Site Health %s', 'Menu Title', 'health-check' ),
+ ( ! $issue_counts || $critical_issues < 1 ? '' : $critical_count )
+ );
+
+ remove_submenu_page( 'tools.php', 'site-health.php' );
+
+ add_submenu_page(
+ 'tools.php',
+ _x( 'Site Health', 'Page Title', 'health-check' ),
+ $menu_title,
+ 'view_site_health_checks',
+ 'health-check',
+ array( $this, 'dashboard_page' )
+ );
+ }
+
+ /**
+ * Add a troubleshooting action link to plugins.
+ *
+ * @param $actions
+ * @param $plugin_file
+ * @param $plugin_data
+ * @param $context
+ *
+ * @return array
+ */
+ public function troubleshoot_plugin_action( $actions, $plugin_file, $plugin_data, $context ) {
+ // Don't add anything if this is a Must-Use plugin, we can't touch those.
+ if ( 'mustuse' === $context ) {
+ return $actions;
+ }
+
+ // Only add troubleshooting actions to active plugins.
+ if ( ! is_plugin_active( $plugin_file ) ) {
+ return $actions;
+ }
+
+ // Set a slug if the plugin lives in the plugins directory root.
+ if ( ! stristr( $plugin_file, '/' ) ) {
+ $plugin_slug = $plugin_file;
+ } else { // Set the slug for plugin inside a folder.
+ $plugin_slug = explode( '/', $plugin_file );
+ $plugin_slug = $plugin_slug[0];
+ }
+
+ $actions['troubleshoot'] = sprintf(
+ '%s',
+ esc_url(
+ add_query_arg(
+ array(
+ 'health-check-troubleshoot-plugin' => $plugin_slug,
+ '_wpnonce' => wp_create_nonce( 'health-check-troubleshoot-plugin-' . $plugin_slug ),
+ ),
+ admin_url( 'plugins.php' )
+ )
+ ),
+ esc_html__( 'Troubleshoot', 'health-check' )
+ );
+
+ return $actions;
+ }
+
+ /**
+ * Add a quick-access action link to the Heath Check page.
+ *
+ * @param $actions
+ *
+ * @return array
+ */
+ public function page_plugin_action( $actions ) {
+
+ $page_link = sprintf(
+ '%s',
+ menu_page_url( 'health-check', false ),
+ _x( 'Health Check', 'Menu, Section and Page Title', 'health-check' )
+ );
+ array_unshift( $actions, $page_link );
+ return $actions;
+ }
+
+ /**
+ * Render our admin page.
+ *
+ * @uses _e()
+ * @uses esc_html__()
+ * @uses printf()
+ * @uses sprintf()
+ * @uses menu_page_url()
+ * @uses dirname()
+ *
+ * @return void
+ */
+ public function dashboard_page() {
+ include_once( HEALTH_CHECK_PLUGIN_DIRECTORY . '/pages/site-health-header.php' );
+
+ switch ( Health_Check::current_tab() ) {
+ case 'debug':
+ include_once( HEALTH_CHECK_PLUGIN_DIRECTORY . '/pages/debug-data.php' );
+ break;
+ case 'phpinfo':
+ include_once( HEALTH_CHECK_PLUGIN_DIRECTORY . '/pages/phpinfo.php' );
+ break;
+ case 'troubleshoot':
+ include_once( HEALTH_CHECK_PLUGIN_DIRECTORY . '/pages/troubleshoot.php' );
+ break;
+ case 'tools':
+ include_once( HEALTH_CHECK_PLUGIN_DIRECTORY . '/pages/tools.php' );
+ break;
+ case 'site-status':
+ default:
+ include_once( HEALTH_CHECK_PLUGIN_DIRECTORY . '/pages/site-status.php' );
+ }
+
+ // Close out the div tag opened as a wrapper in the header.
+ echo '';
+ }
+
+ static function tabs() {
+ return array(
+ 'site-status' => esc_html__( 'Status', 'health-check' ),
+ 'debug' => esc_html__( 'Info', 'health-check' ),
+ 'troubleshoot' => esc_html__( 'Troubleshooting', 'health-check' ),
+ 'tools' => esc_html__( 'Tools', 'health-check' ),
+ );
+ }
+
+ static function current_tab() {
+ return ( isset( $_GET['tab'] ) ? $_GET['tab'] : 'site-status' );
+ }
+
+ /**
+ * Display styled admin notices.
+ *
+ * @uses printf()
+ *
+ * @param string $message A sanitized string containing our notice message.
+ * @param string $status A string representing the status type.
+ *
+ * @return void
+ */
+ static function display_notice( $message, $status = 'success' ) {
+ printf(
+ '
%s
',
+ esc_attr( $status ),
+ $message
+ );
+ }
+
+ /**
+ * Display admin notices if we have any queued.
+ *
+ * @return void
+ */
+ public function admin_notices() {
+ foreach ( $this->admin_notices as $admin_notice ) {
+ printf(
+ '
%s
',
+ esc_attr( $admin_notice->type ),
+ $admin_notice->message
+ );
+ }
+ }
+
+ public function cron_schedules( $schedules ) {
+ if ( ! isset( $schedules['weekly'] ) ) {
+ $schedules['weekly'] = array(
+ 'interval' => 7 * DAY_IN_SECONDS,
+ 'display' => __( 'Once weekly', 'health-check' ),
+ );
+ }
+
+ return $schedules;
+ }
+
+
+ /**
+ * Conditionally show a form for providing filesystem credentials when introducing our troubleshooting mode plugin.
+ *
+ * @uses wp_nonce_url()
+ * @uses add_query_arg()
+ * @uses admin_url()
+ * @uses request_filesystem_credentials()
+ * @uses WP_Filesystem
+ *
+ * @param array $args Any WP_Filesystem arguments you wish to pass.
+ *
+ * @return bool
+ */
+ static function get_filesystem_credentials( $args = array() ) {
+ $args = array_merge(
+ array(
+ 'page' => 'health-check',
+ 'tab' => 'troubleshoot',
+ ),
+ $args
+ );
+
+ $url = wp_nonce_url( add_query_arg( $args, admin_url() ) );
+ $creds = request_filesystem_credentials( $url, '', false, WP_CONTENT_DIR, array( 'health-check-troubleshoot-mode', 'action', '_wpnonce' ) );
+ if ( false === $creds ) {
+ return false;
+ }
+
+ if ( ! WP_Filesystem( $creds ) ) {
+ request_filesystem_credentials( $url, '', true, WPMU_PLUGIN_DIR, array( 'health-check-troubleshoot-mode', 'action', '_wpnonce' ) );
+ return false;
+ }
+
+ return true;
+ }
+
+ public static function plugin_activation() {
+ if ( ! wp_next_scheduled( 'health-check-scheduled-site-status-check' ) ) {
+ wp_schedule_event( time(), 'weekly', 'health-check-scheduled-site-status-check' );
+ }
+ }
+
+ public static function plugin_deactivation() {
+ wp_clear_scheduled_hook( 'health-check-scheduled-site-status-check' );
+ }
+}
diff --git a/wp-content/plugins/health-check/includes/compat.php b/wp-content/plugins/health-check/includes/compat.php
new file mode 100644
index 000000000..8f43ba61d
--- /dev/null
+++ b/wp-content/plugins/health-check/includes/compat.php
@@ -0,0 +1,169 @@
+' ) ) {
+ /**
+ * Fallback function replicating core behavior from WordPress 5.1.0 to check PHP versions.
+ *
+ * @return array|bool|mixed|object|WP_Error
+ */
+ function wp_check_php_version() {
+ $version = phpversion();
+ $key = md5( $version );
+
+ $response = get_site_transient( 'php_check_' . $key );
+ if ( false === $response ) {
+ $url = 'http://api.wordpress.org/core/serve-happy/1.0/';
+ if ( wp_http_supports( array( 'ssl' ) ) ) {
+ $url = set_url_scheme( $url, 'https' );
+ }
+
+ $url = add_query_arg( 'php_version', $version, $url );
+
+ $response = wp_remote_get( $url );
+
+ if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
+ return false;
+ }
+
+ /**
+ * Response should be an array with:
+ * 'recommended_version' - string - The PHP version recommended by WordPress.
+ * 'is_supported' - boolean - Whether the PHP version is actively supported.
+ * 'is_secure' - boolean - Whether the PHP version receives security updates.
+ * 'is_acceptable' - boolean - Whether the PHP version is still acceptable for WordPress.
+ */
+ $response = json_decode( wp_remote_retrieve_body( $response ), true );
+
+ if ( ! is_array( $response ) ) {
+ return false;
+ }
+
+ set_site_transient( 'php_check_' . $key, $response, WEEK_IN_SECONDS );
+ }
+
+ if ( isset( $response['is_acceptable'] ) && $response['is_acceptable'] ) {
+ /**
+ * Filters whether the active PHP version is considered acceptable by WordPress.
+ *
+ * Returning false will trigger a PHP version warning to show up in the admin dashboard to administrators.
+ *
+ * This filter is only run if the wordpress.org Serve Happy API considers the PHP version acceptable, ensuring
+ * that this filter can only make this check stricter, but not loosen it.
+ *
+ * @since 5.1.1
+ *
+ * @param bool $is_acceptable Whether the PHP version is considered acceptable. Default true.
+ * @param string $version PHP version checked.
+ */
+ $response['is_acceptable'] = (bool) apply_filters( 'wp_is_php_version_acceptable', true, $version );
+ }
+
+ return $response;
+ }
+}
+
+if ( ! function_exists( 'wp_get_update_php_url' ) && version_compare( '5.1', $wp_version, '>' ) ) {
+ /**
+ * Fallback function replicating core behavior from WordPress 5.1.0 to check PHP versions.
+ *
+ * @return string URL to learn more about updating PHP.
+ */
+ function wp_get_update_php_url() {
+ $default_url = _x( 'https://wordpress.org/support/update-php/', 'localized PHP upgrade information page', 'health-check' );
+
+ $update_url = $default_url;
+ if ( false !== getenv( 'WP_UPDATE_PHP_URL' ) ) {
+ $update_url = getenv( 'WP_UPDATE_PHP_URL' );
+ }
+
+ /**
+ * Filters the URL to learn more about updating the PHP version the site is running on.
+ *
+ * Providing an empty string is not allowed and will result in the default URL being used. Furthermore
+ * the page the URL links to should preferably be localized in the site language.
+ *
+ * @since 5.1.0
+ *
+ * @param string $update_url URL to learn more about updating PHP.
+ */
+ $update_url = apply_filters( 'wp_update_php_url', $update_url );
+
+ if ( empty( $update_url ) ) {
+ $update_url = $default_url;
+ }
+
+ return $update_url;
+ }
+}
+
+if ( ! function_exists( 'is_countable' ) && version_compare( '4.9.6', $wp_version, '>' ) ) {
+ /**
+ * Fallback function replicating core behavior from WordPress 4.9.6 to check PHP versions.
+ *
+ * Polyfill for is_countable() function added in PHP 7.3.
+ *
+ * Verify that the content of a variable is an array or an object
+ * implementing the Countable interface.
+ *
+ * @param mixed $var The value to check.
+ *
+ * @return bool True if `$var` is countable, false otherwise.
+ */
+ function is_countable( $var ) {
+ return ( is_array( $var )
+ || $var instanceof Countable
+ || $var instanceof SimpleXMLElement
+ || $var instanceof ResourceBundle
+ );
+ }
+}
+
+if ( ! function_exists( 'get_user_count' ) && version_compare( '4.8', $wp_version, '>' ) ) {
+ /**
+ * Fallback function replicating core behavior from WordPress 4.8.0 to check PHP versions.
+ *
+ * @return int Number of active users on the network.
+ */
+ function get_user_count( $network_id = null ) {
+ return get_network_option( $network_id, 'user_count' );
+ }
+}
+
+if ( ! function_exists( 'get_user_locale' ) && version_compare( '4.7', $wp_version, '>' ) ) {
+ /**
+ * Fallback function replicating core behavior from WordPress 4.7.0 to check PHP versions.
+ *
+ * @return string The locale of the user.
+ */
+ function get_user_locale( $user_id = 0 ) {
+ $user = false;
+ if ( 0 === $user_id && function_exists( 'wp_get_current_user' ) ) {
+ $user = wp_get_current_user();
+ } elseif ( $user_id instanceof WP_User ) {
+ $user = $user_id;
+ } elseif ( $user_id && is_numeric( $user_id ) ) {
+ $user = get_user_by( 'id', $user_id );
+ }
+
+ if ( ! $user ) {
+ return get_locale();
+ }
+
+ $locale = $user->locale;
+ return $locale ? $locale : get_locale();
+ }
+}
+
+if ( ! function_exists( 'wp_get_upload_dir' ) && version_compare( '4.5', $wp_version, '>' ) ) {
+ /**
+ * Fallback function replicating core behavior from WordPress 4.5.0 to check PHP versions.
+ *
+ * @return array See `wp_upload_dir()` for description.
+ */
+ function wp_get_upload_dir() {
+ return wp_upload_dir( null, false );
+ }
+}
diff --git a/wp-content/plugins/health-check/includes/tools/class-health-check-files-integrity.php b/wp-content/plugins/health-check/includes/tools/class-health-check-files-integrity.php
new file mode 100644
index 000000000..459b24c4c
--- /dev/null
+++ b/wp-content/plugins/health-check/includes/tools/class-health-check-files-integrity.php
@@ -0,0 +1,252 @@
+label = __( 'File integrity', 'health-check' );
+ $this->description = __( 'The File Integrity checks all the core files with the checksums provided by the WordPress API to see if they are intact. If there are changes you will be able to make a Diff between the files hosted on WordPress.org and your installation to see what has been changed.', 'health-check' );
+
+ add_action( 'wp_ajax_health-check-files-integrity-check', array( $this, 'run_files_integrity_check' ) );
+ add_action( 'wp_ajax_health-check-view-file-diff', array( $this, 'view_file_diff' ) );
+
+ parent::__construct();
+ }
+
+ /**
+ * Gathers checksums from WordPress API and cross checks the core files in the current installation.
+ *
+ * @return void
+ */
+ function run_files_integrity_check() {
+ check_ajax_referer( 'health-check-files-integrity-check' );
+
+ $checksums = $this->call_checksum_api();
+
+ $files = $this->parse_checksum_results( $checksums );
+
+ $this->create_the_response( $files );
+ }
+
+ /**
+ * Calls the WordPress API on the checksums endpoint
+ *
+ * @uses get_bloginfo()
+ * @uses get_locale()
+ * @uses ABSPATH
+ * @uses wp_remote_get()
+ * @uses get_bloginfo()
+ * @uses strpos()
+ * @uses unset()
+ *
+ * @return array
+ */
+ function call_checksum_api() {
+ // Setup variables.
+ $wpversion = get_bloginfo( 'version' );
+ $wplocale = get_locale();
+
+ // Setup API Call.
+ $checksums = get_core_checksums( $wpversion, $wplocale );
+
+ if ( false === $checksums ) {
+ return $checksums;
+ }
+
+ set_transient( 'health-check-checksums', $checksums, 2 * HOUR_IN_SECONDS );
+
+ // Remove the wp-content/ files from checking
+ foreach ( $checksums as $file => $checksum ) {
+ if ( false !== strpos( $file, 'wp-content/' ) ) {
+ unset( $checksums[ $file ] );
+ }
+ }
+
+ return $checksums;
+ }
+
+ /**
+ * Parses the results from the WordPress API call
+ *
+ * @uses file_exists()
+ * @uses md5_file()
+ * @uses ABSPATH
+ *
+ * @param array $checksums
+ *
+ * @return array|bool
+ */
+ function parse_checksum_results( $checksums ) {
+ // Check if the checksums are valid
+ if ( false === $checksums ) {
+ return false;
+ }
+
+ $filepath = ABSPATH;
+ $files = array();
+ // Parse the results.
+ foreach ( $checksums as $file => $checksum ) {
+ // Check the files.
+ if ( file_exists( $filepath . $file ) && md5_file( $filepath . $file ) !== $checksum ) {
+ $reason = esc_html__( 'Content changed', 'health-check' ) . ' ' . esc_html__( '(View Diff)', 'health-check' ) . '';
+ array_push( $files, array( $file, $reason ) );
+ } elseif ( ! file_exists( $filepath . $file ) ) {
+ $reason = esc_html__( 'File not found', 'health-check' );
+ array_push( $files, array( $file, $reason ) );
+ }
+ }
+ return $files;
+ }
+
+ /**
+ * Generates the response
+ *
+ * @uses wp_send_json_success()
+ * @uses wp_die()
+ * @uses ABSPATH
+ *
+ * @param null|array $files
+ *
+ * @return void
+ */
+ function create_the_response( $files ) {
+ $filepath = ABSPATH;
+ $output = '';
+
+ if ( empty( $files ) ) {
+ $output .= '
';
+ $output .= esc_html__( 'All files passed the check. Everything seems to be ok!', 'health-check' );
+ $output .= '
';
+ } else {
+ $output .= '
';
+ $output .= esc_html__( 'It appears as if some files may have been modified.', 'health-check' );
+ $output .= ' ' . esc_html__( 'One possible reason for this may be that your installation contains translated versions. An easy way to clear this is to reinstall WordPress. Don\'t worry. This will only affect WordPress\' own files, not your themes, plugins or uploaded media.', 'health-check' );
+ $output .= '
+
+ label = __( 'Mail Check', 'health-check' );
+ $this->description = __( 'The Mail Check will invoke the wp_mail() function and check if it succeeds. We will use the E-mail address you have set up, but you can change it below if you like.', 'health-check' );
+
+ add_action( 'wp_ajax_health-check-mail-check', array( $this, 'run_mail_check' ) );
+
+ parent::__construct();
+ }
+
+ /**
+ * Checks if wp_mail() works.
+ *
+ * @uses sanitize_email()
+ * @uses wp_mail()
+ * @uses wp_send_json_success()
+ * @uses wp_die()
+ *
+ * @return void
+ */
+ static function run_mail_check() {
+ check_ajax_referer( 'health-check-mail-check' );
+
+ if ( ! current_user_can( 'view_site_health_checks' ) ) {
+ wp_send_json_error();
+ }
+
+ $output = '';
+ $sendmail = false;
+ $email = sanitize_email( $_POST['email'] );
+ $email_message = sanitize_text_field( $_POST['email_message'] );
+ $wp_address = get_bloginfo( 'url' );
+ $wp_name = get_bloginfo( 'name' );
+ $date = date_i18n( get_option( 'date_format' ), current_time( 'timestamp' ) );
+ $time = date_i18n( get_option( 'time_format' ), current_time( 'timestamp' ) );
+
+ // translators: %s: website url.
+ $email_subject = sprintf( esc_html__( 'Health Check – Test Message from %s', 'health-check' ), $wp_address );
+
+ $email_body = sprintf(
+ // translators: %1$s: website name. %2$s: website url. %3$s: The date the message was sent. %4$s: The time the message was sent.
+ __( 'Hi! This test message was sent by the Health Check plugin from %1$s (%2$s) on %3$s at %4$s. Since you’re reading this, it obviously works.', 'health-check' ),
+ $wp_name,
+ $wp_address,
+ $date,
+ $time,
+ $email_message
+ );
+
+ if ( ! empty( $email_message ) ) {
+ $email_body .= "\n\n" . sprintf(
+ // translators: %s: The custom message that may be included with the email.
+ __( 'Additional message from admin: %s', 'health-check' ),
+ $email_message
+ );
+ }
+
+ $sendmail = wp_mail( $email, $email_subject, $email_body );
+
+ if ( ! empty( $sendmail ) ) {
+ $output .= '
';
+ $output .= __( 'We have just sent an e-mail using wp_mail() and it seems to work. Please check your inbox and spam folder to see if you received it.', 'health-check' );
+ $output .= '
';
+ } else {
+ $output .= '
';
+ $output .= esc_html__( 'It seems there was a problem sending the e-mail.', 'health-check' );
+ $output .= '
';
+ }
+
+ $response = array(
+ 'message' => $output,
+ );
+
+ wp_send_json_success( $response );
+
+ wp_die();
+
+ }
+
+ /**
+ * Add the Mail Checker to the tools tab.
+ *
+ * @return void
+ */
+ public function tab_content() {
+ ?>
+
+
+
+
+
+ label = __( 'Plugin compatibility', 'health-check' );
+ $this->description = sprintf(
+ '%s %s',
+ __( 'Attempt to identify the compatibility of your plugins before upgrading PHP, note that a compatibility check may not always be accurate, and you may want to contact the plugin author to confirm that things will continue working.', 'health-check' ),
+ __( 'The compatibility check will need to send requests to the WPTide project to fetch the test results for each of your plugins.', 'health-check' )
+ );
+
+ add_action( 'wp_ajax_health-check-tools-plugin-compat', array( $this, 'check_plugin_version' ) );
+
+ parent::__construct();
+ }
+
+ public function tab_content() {
+ ?>
+
&).
+ // If any entities are part of the JSON blob, we want to re-encoode them
+ // (double-encode them) so that they are displayed correctly in the debug
+ // bar.
+ // Use _wp_specialchars() "manually" to ensure entities are encoded correctly.
+ echo _wp_specialchars(
+ wp_json_encode( $value ),
+ ENT_NOQUOTES, // Don't need to encode quotes (output is for a text node).
+ 'UTF-8', // wp_json_encode() outputs UTF-8 (really just ASCII), not the blog's charset.
+ true // Do "double-encode" existing HTML entities
+ );
+ ?>
+
+
+
+ function_exists( 'domain_mapping_siteurl' ) ) {
+ return false;
+ }
+
+ add_filter( 'jetpack_sync_home_url', 'domain_mapping_siteurl' );
+ add_filter( 'jetpack_sync_site_url', 'domain_mapping_siteurl' );
+
+ return true;
+ }
+
+ /**
+ * This method will test for a class and method known to be used in WPMU Dev's domain mapping plugin. If the
+ * method exists, then we'll hook the swap_to_mapped_url() to our Jetpack sync filters for home_url and site_url.
+ *
+ * @return bool
+ */
+ function hook_wpmu_dev_domain_mapping() {
+ if ( ! $this->class_exists( 'domain_map' ) || ! $this->method_exists( 'domain_map', 'utils' ) ) {
+ return false;
+ }
+
+ $utils = $this->get_domain_mapping_utils_instance();
+ add_filter( 'jetpack_sync_home_url', array( $utils, 'swap_to_mapped_url' ) );
+ add_filter( 'jetpack_sync_site_url', array( $utils, 'swap_to_mapped_url' ) );
+
+ return true;
+ }
+
+ /*
+ * Utility Methods
+ *
+ * These methods are very minimal, and in most cases, simply pass on arguments. Why create them you ask?
+ * So that we can test.
+ */
+
+ public function method_exists( $class, $method ) {
+ return method_exists( $class, $method );
+ }
+
+ public function class_exists( $class ) {
+ return class_exists( $class );
+ }
+
+ public function function_exists( $function ) {
+ return function_exists( $function );
+ }
+
+ public function get_domain_mapping_utils_instance() {
+ return domain_map::utils();
+ }
+}
+
+Jetpack_3rd_Party_Domain_Mapping::init();
diff --git a/wp-content/plugins/jetpack/3rd-party/polldaddy.php b/wp-content/plugins/jetpack/3rd-party/polldaddy.php
new file mode 100644
index 000000000..ec4848298
--- /dev/null
+++ b/wp-content/plugins/jetpack/3rd-party/polldaddy.php
@@ -0,0 +1,7 @@
+
+
+ timezone ) {
+ try {
+ $start_time = new DateTime( $event['DTSTART'] );
+ $timezone_offset = $this->timezone->getOffset( $start_time );
+ $start += $timezone_offset;
+
+ if ( $end ) {
+ $end += $timezone_offset;
+ }
+ } catch ( Exception $e ) {
+ // Invalid argument to DateTime
+ }
+ }
+ $single_day = $end ? ( $end - $start ) <= DAY_IN_SECONDS : true;
+
+ /* translators: Date and time */
+ $date_with_time = __( '%1$s at %2$s' , 'jetpack' );
+ /* translators: Two dates with a separator */
+ $two_dates = __( '%1$s – %2$s' , 'jetpack' );
+
+ // we'll always have the start date. Maybe with time
+ if ( $all_day )
+ $date = date_i18n( $date_format, $start );
+ else
+ $date = sprintf( $date_with_time, date_i18n( $date_format, $start ), date_i18n( $time_format, $start ) );
+
+ // single day, timed
+ if ( $single_day && ! $all_day && false !== $end )
+ $date = sprintf( $two_dates, $date, date_i18n( $time_format, $end ) );
+
+ // multi-day
+ if ( ! $single_day ) {
+
+ if ( $all_day ) {
+ // DTEND for multi-day events represents "until", not "including", so subtract one minute
+ $end_date = date_i18n( $date_format, $end - 60 );
+ } else {
+ $end_date = sprintf( $date_with_time, date_i18n( $date_format, $end ), date_i18n( $time_format, $end ) );
+ }
+
+ $date = sprintf( $two_dates, $date, $end_date );
+
+ }
+
+ return $date;
+ }
+
+ protected function sort_by_recent( $list ) {
+ $dates = $sorted_list = array();
+
+ foreach ( $list as $key => $row ) {
+ $date = $row['DTSTART'];
+ // pad some time onto an all day date
+ if ( 8 === strlen( $date ) )
+ $date .= 'T000000Z';
+ $dates[$key] = $date;
+ }
+ asort( $dates );
+ foreach( $dates as $key => $value ) {
+ $sorted_list[$key] = $list[$key];
+ }
+ unset($list);
+ return $sorted_list;
+ }
+
+}
+
+
+/**
+ * Wrapper function for iCalendarReader->get_events()
+ *
+ * @param string $url (default: '')
+ * @return array
+ */
+function icalendar_get_events( $url = '', $count = 5 ) {
+ // Find your calendar's address https://support.google.com/calendar/bin/answer.py?hl=en&answer=37103
+ $ical = new iCalendarReader();
+ return $ical->get_events( $url, $count );
+}
+
+/**
+ * Wrapper function for iCalendarReader->render()
+ *
+ * @param string $url (default: '')
+ * @param string $context (default: 'widget') or 'shortcode'
+ * @return mixed bool|string false on failure, rendered HTML string on success.
+ */
+function icalendar_render_events( $url = '', $args = array() ) {
+ $ical = new iCalendarReader();
+ return $ical->render( $url, $args );
+}
diff --git a/wp-content/plugins/jetpack/_inc/lib/jetpack-wpes-query-builder/jetpack-wpes-query-builder.php b/wp-content/plugins/jetpack/_inc/lib/jetpack-wpes-query-builder/jetpack-wpes-query-builder.php
new file mode 100644
index 000000000..d3481ce5f
--- /dev/null
+++ b/wp-content/plugins/jetpack/_inc/lib/jetpack-wpes-query-builder/jetpack-wpes-query-builder.php
@@ -0,0 +1,341 @@
+add_filter( ... );
+ * $bldr->add_filter( ... );
+ * $bldr->add_query( ... );
+ * $es_query = $bldr->build_query();
+ *
+ *
+ * All ES queries take a standard form with main query (with some filters),
+ * wrapped in a function_score
+ *
+ * Bucketed queries use an aggregation to diversify results. eg a bunch
+ * of separate filters where to get different sets of results.
+ *
+ */
+
+class Jetpack_WPES_Query_Builder {
+
+ protected $es_filters = array();
+
+ // Custom boosting with function_score
+ protected $functions = array();
+ protected $decays = array();
+ protected $scripts = array();
+ protected $functions_max_boost = 2.0;
+ protected $functions_score_mode = 'multiply';
+ protected $query_bool_boost = null;
+
+ // General aggregations for buckets and metrics
+ protected $aggs_query = false;
+ protected $aggs = array();
+
+ // The set of top level text queries to combine
+ protected $must_queries = array();
+ protected $should_queries = array();
+ protected $dis_max_queries = array();
+
+ protected $diverse_buckets_query = false;
+ protected $bucket_filters = array();
+ protected $bucket_sub_aggs = array();
+
+ ////////////////////////////////////
+ // Methods for building a query
+
+ public function add_filter( $filter ) {
+ $this->es_filters[] = $filter;
+ }
+
+ public function add_query( $query, $type = 'must' ) {
+ switch ( $type ) {
+ case 'dis_max':
+ $this->dis_max_queries[] = $query;
+ break;
+
+ case 'should':
+ $this->should_queries[] = $query;
+ break;
+
+ case 'must':
+ default:
+ $this->must_queries[] = $query;
+ break;
+ }
+ }
+
+ /**
+ * Add a scoring function to the query
+ *
+ * NOTE: For decays (linear, exp, or gauss), use Jetpack_WPES_Query_Builder::add_decay() instead
+ *
+ * @see https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html
+ *
+ * @param $function string name of the function
+ * @param $params array functions parameters
+ *
+ * @return void
+ */
+ public function add_function( $function, $params ) {
+ $this->functions[ $function ][] = $params;
+ }
+
+ /**
+ * Add a decay function to score results
+ *
+ * This method should be used instead of Jetpack_WPES_Query_Builder::add_function() for decays, as the internal ES structure
+ * is slightly different for them.
+ *
+ * @see https://www.elastic.co/guide/en/elasticsearch/guide/current/decay-functions.html
+ *
+ * @param $function string name of the decay function - linear, exp, or gauss
+ * @param $params array The decay functions parameters, passed to ES directly
+ *
+ * @return void
+ */
+ public function add_decay( $function, $params ) {
+ $this->decays[ $function ][] = $params;
+ }
+
+ /**
+ * Add a scoring mode to the query
+ *
+ * @see https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html
+ *
+ * @param $mode string name of how to score
+ *
+ * @return void
+ */
+ public function add_score_mode_to_functions( $mode='multiply' ) {
+ $this->functions_score_mode = $mode;
+ }
+
+ public function add_max_boost_to_functions( $boost ) {
+ $this->functions_max_boost = $boost;
+ }
+
+ public function add_boost_to_query_bool( $boost ) {
+ $this->query_bool_boost = $boost;
+ }
+
+ public function add_aggs( $aggs_name, $aggs ) {
+ $this->aggs_query = true;
+ $this->aggs[$aggs_name] = $aggs;
+ }
+
+ public function add_aggs_sub_aggs( $aggs_name, $sub_aggs ) {
+ if ( ! array_key_exists( 'aggs', $this->aggs[$aggs_name] ) ) {
+ $this->aggs[$aggs_name]['aggs'] = array();
+ }
+ $this->aggs[$aggs_name]['aggs'] = $sub_aggs;
+ }
+
+ public function add_bucketed_query( $name, $query ) {
+ $this->_add_bucket_filter( $name, $query );
+
+ $this->add_query( $query, 'dis_max' );
+ }
+
+ public function add_bucketed_terms( $name, $field, $terms, $boost = 1 ) {
+ if ( ! is_array( $terms ) ) {
+ $terms = array( $terms );
+ }
+
+ $this->_add_bucket_filter( $name, array(
+ 'terms' => array(
+ $field => $terms,
+ ),
+ ));
+
+ $this->add_query( array(
+ 'constant_score' => array(
+ 'filter' => array(
+ 'terms' => array(
+ $field => $terms,
+ ),
+ ),
+ 'boost' => $boost,
+ ),
+ ), 'dis_max' );
+ }
+
+ public function add_bucket_sub_aggs( $agg ) {
+ $this->bucket_sub_aggs = array_merge( $this->bucket_sub_aggs, $agg );
+ }
+
+ protected function _add_bucket_filter( $name, $filter ) {
+ $this->diverse_buckets_query = true;
+ $this->bucket_filters[ $name ] = $filter;
+ }
+
+ ////////////////////////////////////
+ // Building Final Query
+
+ /**
+ * Combine all the queries, functions, decays, scripts, and max_boost into an ES query
+ *
+ * @return array Array representation of the built ES query
+ */
+ public function build_query() {
+ $query = array();
+
+ //dis_max queries just become a single must query
+ if ( ! empty( $this->dis_max_queries ) ) {
+ $this->must_queries[] = array(
+ 'dis_max' => array(
+ 'queries' => $this->dis_max_queries,
+ ),
+ );
+ }
+
+ if ( empty( $this->must_queries ) ) {
+ $this->must_queries = array(
+ array(
+ 'match_all' => array(),
+ ),
+ );
+ }
+
+ if ( empty( $this->should_queries ) ) {
+ if ( 1 == count( $this->must_queries ) ) {
+ $query = $this->must_queries[0];
+ } else {
+ $query = array(
+ 'bool' => array(
+ 'must' => $this->must_queries,
+ ),
+ );
+ }
+ } else {
+ $query = array(
+ 'bool' => array(
+ 'must' => $this->must_queries,
+ 'should' => $this->should_queries,
+ ),
+ );
+ }
+
+ if ( ! is_null( $this->query_bool_boost ) && isset( $query['bool'] ) ) {
+ $query['bool']['boost'] = $this->query_bool_boost;
+ }
+
+ // If there are any function score adjustments, then combine those
+ if ( $this->functions || $this->decays || $this->scripts ) {
+ $weighting_functions = array();
+
+ if ( $this->functions ) {
+ foreach ( $this->functions as $function_type => $configs ) {
+ foreach ( $configs as $config ) {
+ foreach ( $config as $field => $params ) {
+ $func_arr = $params;
+
+ $func_arr['field'] = $field;
+
+ $weighting_functions[] = array(
+ $function_type => $func_arr,
+ );
+ }
+ }
+ }
+ }
+
+ if ( $this->decays ) {
+ foreach ( $this->decays as $decay_type => $configs ) {
+ foreach ( $configs as $config ) {
+ foreach ( $config as $field => $params ) {
+ $weighting_functions[] = array(
+ $decay_type => array(
+ $field => $params,
+ ),
+ );
+ }
+ }
+ }
+ }
+
+ if ( $this->scripts ) {
+ foreach ( $this->scripts as $script ) {
+ $weighting_functions[] = array(
+ 'script_score' => array(
+ 'script' => $script,
+ ),
+ );
+ }
+ }
+
+ $query = array(
+ 'function_score' => array(
+ 'query' => $query,
+ 'functions' => $weighting_functions,
+ 'max_boost' => $this->functions_max_boost,
+ 'score_mode' => $this->functions_score_mode,
+ ),
+ );
+ } // End if().
+
+ return $query;
+ }
+
+ /**
+ * Assemble the 'filter' portion of an ES query, from all registered filters
+ *
+ * @return array|null Combined ES filters, or null if none have been defined
+ */
+ public function build_filter() {
+ if ( empty( $this->es_filters ) ) {
+ $filter = null;
+ } elseif ( 1 == count( $this->es_filters ) ) {
+ $filter = $this->es_filters[0];
+ } else {
+ $filter = array(
+ 'and' => $this->es_filters,
+ );
+ }
+
+ return $filter;
+ }
+
+ /**
+ * Assemble the 'aggregation' portion of an ES query, from all general aggregations.
+ *
+ * @return array An aggregation query as an array of topics, filters, and bucket names
+ */
+ public function build_aggregation() {
+ if ( empty( $this->bucket_sub_aggs ) && empty( $this->aggs_query ) ) {
+ return array();
+ }
+
+ if ( ! $this->diverse_buckets_query && empty( $this->aggs_query ) ) {
+ return $this->bucket_sub_aggs;
+ }
+
+ $aggregations = array(
+ 'topics' => array(
+ 'filters' => array(
+ 'filters' => array(),
+ ),
+ ),
+ );
+
+ if ( ! empty( $this->bucket_sub_aggs ) ) {
+ $aggregations['topics']['aggs'] = $this->bucket_sub_aggs;
+ }
+
+ foreach ( $this->bucket_filters as $bucket_name => $filter ) {
+ $aggregations['topics']['filters']['filters'][ $bucket_name ] = $filter;
+ }
+
+ if ( ! empty( $this->aggs_query ) ) {
+ $aggregations = $this->aggs;
+ }
+
+ return $aggregations;
+ }
+
+}
diff --git a/wp-content/plugins/jetpack/_inc/lib/jetpack-wpes-query-builder/jetpack-wpes-query-parser.php b/wp-content/plugins/jetpack/_inc/lib/jetpack-wpes-query-builder/jetpack-wpes-query-parser.php
new file mode 100644
index 000000000..2b7710cbd
--- /dev/null
+++ b/wp-content/plugins/jetpack/_inc/lib/jetpack-wpes-query-builder/jetpack-wpes-query-parser.php
@@ -0,0 +1,683 @@
+author_field_filter( array(
+ * 'prefixes' => array( '@' ),
+ * 'wpcom_id_field' => 'author_id',
+ * 'must_query_fields' => array( 'author.engram', 'author_login.engram' ),
+ * 'boost_query_fields' => array( 'author^2', 'author_login^2', 'title.default.engram' ),
+ * ) );
+ *
+ * //remainder of query
+ * $match_content_fields = $parser->merge_ml_fields(
+ * array(
+ * 'all_content' => 0.1,
+ * ),
+ * array(
+ * 'all_content.default.engram^0.1',
+ * )
+ * );
+ * $boost_content_fields = $parser->merge_ml_fields(
+ * array(
+ * 'title' => 2,
+ * 'description' => 1,
+ * 'tags' => 1,
+ * ),
+ * array(
+ * 'author_login^2',
+ * 'author^2',
+ * )
+ * );
+ *
+ * $parser->phrase_filter( array(
+ * 'must_query_fields' => $match_content_fields,
+ * 'boost_query_fields' => $boost_content_fields,
+ * ) );
+ * $parser->remaining_query( array(
+ * 'must_query_fields' => $match_content_fields,
+ * 'boost_query_fields' => $boost_content_fields,
+ * ) );
+ *
+ * //Boost on phrases
+ * $parser->remaining_query( array(
+ * 'boost_query_fields' => $boost_content_fields,
+ * 'boost_query_type' => 'phrase',
+ * ) );
+ *
+ * //boosting
+ * $parser->add_max_boost_to_functions( 20 );
+ * $parser->add_function( 'field_value_factor', array(
+ * 'follower_count' => array(
+ * 'modifier' => 'sqrt',
+ * 'factor' => 1,
+ * 'missing' => 0,
+ * ) ) );
+ *
+ * //Filtering
+ * $parser->add_filter( array(
+ * 'exists' => array( 'field' => 'langs.' . $lang )
+ * ) );
+ *
+ * //run the query
+ * $es_query_args = array(
+ * 'name' => 'feeds',
+ * 'blog_id' => false,
+ * 'security_strategy' => 'a8c',
+ * 'type' => 'feed,blog',
+ * 'fields' => array( 'blog_id', 'feed_id' ),
+ * 'query' => $parser->build_query(),
+ * 'filter' => $parser->build_filter(),
+ * 'size' => $size,
+ * 'from' => $from
+ * );
+ * $es_results = es_api_search_index( $es_query_args, 'api-feed-find' );
+ *
+ */
+
+jetpack_require_lib( 'jetpack-wpes-query-builder' );
+
+class Jetpack_WPES_Search_Query_Parser extends Jetpack_WPES_Query_Builder {
+
+ protected $orig_query = '';
+ protected $current_query = '';
+ protected $langs;
+ protected $avail_langs = array( 'ar', 'bg', 'ca', 'cs', 'da', 'de', 'el', 'en', 'es', 'eu', 'fa', 'fi', 'fr', 'he', 'hi', 'hu', 'hy', 'id', 'it', 'ja', 'ko', 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh' );
+
+ public function __construct( $user_query, $langs ) {
+ $this->orig_query = $user_query;
+ $this->current_query = $this->orig_query;
+ $this->langs = $this->norm_langs( $langs );
+ }
+
+ protected $extracted_phrases = array();
+
+ ///////////////////////////////////////////////////////
+ // Methods for Building arrays of multilingual fields
+
+ /*
+ * Normalize language codes
+ */
+ public function norm_langs( $langs ) {
+ $lst = array();
+ foreach( $langs as $l ) {
+ $l = strtok( $l, '-_' );
+ if ( in_array( $l, $this->avail_langs ) ) {
+ $lst[$l] = true;
+ } else {
+ $lst['default'] = true;
+ }
+ }
+ return array_keys( $lst );
+ }
+
+ /*
+ * Take a list of field prefixes and expand them for multi-lingual
+ * with the provided boostings.
+ */
+ public function merge_ml_fields( $fields2boosts, $additional_fields ) {
+ $flds = array();
+ foreach( $fields2boosts as $f => $b ) {
+ foreach( $this->langs as $l ) {
+ $flds[] = $f . '.' . $l . '^' . $b;
+ }
+ }
+ foreach( $additional_fields as $f ) {
+ $flds[] = $f;
+ }
+ return $flds;
+ }
+
+ ////////////////////////////////////
+ // Extract Fields for Filtering on
+
+ /*
+ * Extract any @mentions from the user query
+ * use them as a filter if we can find a wp.com id
+ * otherwise use them as a
+ *
+ * args:
+ * wpcom_id_field: wp.com id field
+ * must_query_fields: array of fields to search for matching results (optional)
+ * boost_query_fields: array of fields to search in for boosting results (optional)
+ * prefixes: array of prefixes that the user can use to indicate an author
+ *
+ * returns true/false of whether any were found
+ *
+ * See also: https://github.com/twitter/twitter-text/blob/master/java/src/com/twitter/Regex.java
+ */
+ public function author_field_filter( $args ) {
+ $defaults = array(
+ 'wpcom_id_field' => 'author_id',
+ 'must_query_fields' => null,
+ 'boost_query_fields' => null,
+ 'prefixes' => array( '@' ),
+ );
+ $args = wp_parse_args( $args, $defaults );
+
+ $names = array();
+ foreach( $args['prefixes'] as $p ) {
+ $found = $this->get_fields( $p );
+ if ( $found ) {
+ foreach( $found as $f ) {
+ $names[] = $f;
+ }
+ }
+ }
+
+ if ( empty( $names ) ) {
+ return false;
+ }
+
+ foreach( $args['prefixes'] as $p ) {
+ $this->remove_fields( $p );
+ }
+
+ $user_ids = array();
+ $query_names = array();
+
+ //loop through the matches and separate into filters and queries
+ foreach( $names as $n ) {
+ //check for exact match on login
+ $userdata = get_user_by( 'login', strtolower( $n ) );
+ $filtering = false;
+ if ( $userdata ) {
+ $user_ids[ $userdata->ID ] = true;
+ $filtering = true;
+ }
+
+ $is_phrase = false;
+ if ( preg_match( '/"/', $n ) ) {
+ $is_phrase = true;
+ $n = preg_replace( '/"/', '', $n );
+ }
+
+ if ( !empty( $args['must_query_fields'] ) && !$filtering ) {
+ if ( $is_phrase ) {
+ $this->add_query( array(
+ 'multi_match' => array(
+ 'fields' => $args['must_query_fields'],
+ 'query' => $n,
+ 'type' => 'phrase',
+ ) ) );
+ } else {
+ $this->add_query( array(
+ 'multi_match' => array(
+ 'fields' => $args['must_query_fields'],
+ 'query' => $n,
+ ) ) );
+ }
+ }
+
+ if ( !empty( $args['boost_query_fields'] ) ) {
+ if ( $is_phrase ) {
+ $this->add_query( array(
+ 'multi_match' => array(
+ 'fields' => $args['boost_query_fields'],
+ 'query' => $n,
+ 'type' => 'phrase',
+ ) ), 'should' );
+ } else {
+ $this->add_query( array(
+ 'multi_match' => array(
+ 'fields' => $args['boost_query_fields'],
+ 'query' => $n,
+ ) ), 'should' );
+ }
+ }
+ }
+
+ if ( ! empty( $user_ids ) ) {
+ $user_ids = array_keys( $user_ids );
+ $this->add_filter( array( 'terms' => array( $args['wpcom_id_field'] => $user_ids ) ) );
+ }
+
+ return true;
+ }
+
+ /*
+ * Extract any prefix followed by text use them as a must clause,
+ * and optionally as a boost to the should query
+ * This can be used for hashtags. eg #News, or #"current events",
+ * but also works for any arbitrary field. eg from:Greg
+ *
+ * args:
+ * must_query_fields: array of fields that must match the tag (optional)
+ * boost_query_fields: array of fields to boost search on (optional)
+ * prefixes: array of prefixes that the user can use to indicate a tag
+ *
+ * returns true/false of whether any were found
+ *
+ */
+ public function text_field_filter( $args ) {
+ $defaults = array(
+ 'must_query_fields' => array( 'tag.name' ),
+ 'boost_query_fields' => array( 'tag.name' ),
+ 'prefixes' => array( '#' ),
+ );
+ $args = wp_parse_args( $args, $defaults );
+
+ $tags = array();
+ foreach( $args['prefixes'] as $p ) {
+ $found = $this->get_fields( $p );
+ if ( $found ) {
+ foreach( $found as $f ) {
+ $tags[] = $f;
+ }
+ }
+ }
+
+ if ( empty( $tags ) ) {
+ return false;
+ }
+
+ foreach( $args['prefixes'] as $p ) {
+ $this->remove_fields( $p );
+ }
+
+ foreach( $tags as $t ) {
+ $is_phrase = false;
+ if ( preg_match( '/"/', $t ) ) {
+ $is_phrase = true;
+ $t = preg_replace( '/"/', '', $t );
+ }
+
+ if ( ! empty( $args['must_query_fields'] ) ) {
+ if ( $is_phrase ) {
+ $this->add_query( array(
+ 'multi_match' => array(
+ 'fields' => $args['must_query_fields'],
+ 'query' => $t,
+ 'type' => 'phrase',
+ ) ) );
+ } else {
+ $this->add_query( array(
+ 'multi_match' => array(
+ 'fields' => $args['must_query_fields'],
+ 'query' => $t,
+ ) ) );
+ }
+ }
+
+ if ( ! empty( $args['boost_query_fields'] ) ) {
+ if ( $is_phrase ) {
+ $this->add_query( array(
+ 'multi_match' => array(
+ 'fields' => $args['boost_query_fields'],
+ 'query' => $t,
+ 'type' => 'phrase',
+ ) ), 'should' );
+ } else {
+ $this->add_query( array(
+ 'multi_match' => array(
+ 'fields' => $args['boost_query_fields'],
+ 'query' => $t,
+ ) ), 'should' );
+ }
+ }
+ }
+
+ return true;
+ }
+
+ /*
+ * Extract anything surrounded by quotes or if there is an opening quote
+ * that is not complete, and add them to the query as a phrase query.
+ * Quotes can be either '' or ""
+ *
+ * args:
+ * must_query_fields: array of fields that must match the phrases
+ * boost_query_fields: array of fields to boost the phrases on (optional)
+ *
+ * returns true/false of whether any were found
+ *
+ */
+ public function phrase_filter( $args ) {
+ $defaults = array(
+ 'must_query_fields' => array( 'all_content' ),
+ 'boost_query_fields' => array( 'title' ),
+ );
+ $args = wp_parse_args( $args, $defaults );
+
+ $phrases = array();
+ if ( preg_match_all( '/"([^"]+)"/', $this->current_query, $matches ) ) {
+ foreach ( $matches[1] as $match ) {
+ $phrases[] = $match;
+ }
+ $this->current_query = preg_replace( '/"([^"]+)"/', '', $this->current_query );
+ }
+
+ if ( preg_match_all( "/'([^']+)'/", $this->current_query, $matches ) ) {
+ foreach ( $matches[1] as $match ) {
+ $phrases[] = $match;
+ }
+ $this->current_query = preg_replace( "/'([^']+)'/", '', $this->current_query );
+ }
+
+ //look for a final, uncompleted phrase
+ $phrase_prefix = false;
+ if ( preg_match_all( '/"([^"]+)$/', $this->current_query, $matches ) ) {
+ $phrase_prefix = $matches[1][0];
+ $this->current_query = preg_replace( '/"([^"]+)$/', '', $this->current_query );
+ }
+ if ( preg_match_all( "/(?:'\B|\B')([^']+)$/", $this->current_query, $matches ) ) {
+ $phrase_prefix = $matches[1][0];
+ $this->current_query = preg_replace( "/(?:'\B|\B')([^']+)$/", '', $this->current_query );
+ }
+
+ if ( $phrase_prefix ) {
+ $phrases[] = $phrase_prefix;
+ }
+ if ( empty( $phrases ) ) {
+ return false;
+ }
+
+ foreach ( $phrases as $p ) {
+ $this->add_query( array(
+ 'multi_match' => array(
+ 'fields' => $args['must_query_fields'],
+ 'query' => $p,
+ 'type' => 'phrase',
+ ) ) );
+
+ if ( ! empty( $args['boost_query_fields'] ) ) {
+ $this->add_query( array(
+ 'multi_match' => array(
+ 'fields' => $args['boost_query_fields'],
+ 'query' => $p,
+ 'operator' => 'and',
+ ) ), 'should' );
+ }
+ }
+
+ return true;
+ }
+
+ /*
+ * Query fields based on the remaining parts of the query
+ * This could be the final AND part of the query terms to match, or it
+ * could be boosting certain elements of the query
+ *
+ * args:
+ * must_query_fields: array of fields that must match the remaining terms (optional)
+ * boost_query_fields: array of fields to boost the remaining terms on (optional)
+ *
+ */
+ public function remaining_query( $args ) {
+ $defaults = array(
+ 'must_query_fields' => null,
+ 'boost_query_fields' => null,
+ 'boost_operator' => 'and',
+ 'boost_query_type' => 'best_fields',
+ );
+ $args = wp_parse_args( $args, $defaults );
+
+ if ( empty( $this->current_query ) || ctype_space( $this->current_query ) ) {
+ return;
+ }
+
+ if ( ! empty( $args['must_query_fields'] ) ) {
+ $this->add_query( array(
+ 'multi_match' => array(
+ 'fields' => $args['must_query_fields'],
+ 'query' => $this->current_query,
+ 'operator' => 'and',
+ ) ) );
+ }
+
+ if ( ! empty( $args['boost_query_fields'] ) ) {
+ $this->add_query( array(
+ 'multi_match' => array(
+ 'fields' => $args['boost_query_fields'],
+ 'query' => $this->current_query,
+ 'operator' => $args['boost_operator'],
+ 'type' => $args['boost_query_type'],
+ ) ), 'should' );
+ }
+
+ }
+
+ /*
+ * Query fields using a prefix query (alphabetical expansions on the index).
+ * This is not recommended. Slower performance and worse relevancy.
+ *
+ * (UNTESTED! Copied from old prefix expansion code)
+ *
+ * args:
+ * must_query_fields: array of fields that must match the remaining terms (optional)
+ * boost_query_fields: array of fields to boost the remaining terms on (optional)
+ *
+ */
+ public function remaining_prefix_query( $args ) {
+ $defaults = array(
+ 'must_query_fields' => array( 'all_content' ),
+ 'boost_query_fields' => array( 'title' ),
+ 'boost_operator' => 'and',
+ 'boost_query_type' => 'best_fields',
+ );
+ $args = wp_parse_args( $args, $defaults );
+
+ if ( empty( $this->current_query ) || ctype_space( $this->current_query ) ) {
+ return;
+ }
+
+ //////////////////////////////////
+ // Example cases to think about:
+ // "elasticse"
+ // "elasticsearch"
+ // "elasticsearch "
+ // "elasticsearch lucen"
+ // "elasticsearch lucene"
+ // "the future" - note the stopword which will match nothing!
+ // "F1" - an exact match that also has tons of expansions
+ // "こんにちは" ja "hello"
+ // "こんにちは友人" ja "hello friend" - we just rely on the prefix phrase and ES to split words
+ // - this could still be better I bet. Maybe we need to analyze with ES first?
+ //
+
+ /////////////////////////////
+ //extract pieces of query
+ // eg: "PREFIXREMAINDER PREFIXWORD"
+ // "elasticsearch lucen"
+
+ $prefix_word = false;
+ $prefix_remainder = false;
+ if ( preg_match_all( '/([^ ]+)$/', $this->current_query, $matches ) ) {
+ $prefix_word = $matches[1][0];
+ }
+
+ $prefix_remainder = preg_replace( '/([^ ]+)$/', '', $this->current_query );
+ if ( ctype_space( $prefix_remainder ) ) {
+ $prefix_remainder = false;
+ }
+
+ if ( ! $prefix_word ) {
+ //Space at the end of the query, so skip using a prefix query
+ if ( ! empty( $args['must_query_fields'] ) ) {
+ $this->add_query( array(
+ 'multi_match' => array(
+ 'fields' => $args['must_query_fields'],
+ 'query' => $this->current_query,
+ 'operator' => 'and',
+ ) ) );
+ }
+
+ if ( ! empty( $args['boost_query_fields'] ) ) {
+ $this->add_query( array(
+ 'multi_match' => array(
+ 'fields' => $args['boost_query_fields'],
+ 'query' => $this->current_query,
+ 'operator' => $args['boost_operator'],
+ 'type' => $args['boost_query_type'],
+ ) ), 'should' );
+ }
+ } else {
+
+ //must match the prefix word and the prefix remainder
+ if ( ! empty( $args['must_query_fields'] ) ) {
+ //need to do an OR across a few fields to handle all cases
+ $must_q = array( 'bool' => array( 'should' => array( ), 'minimum_should_match' => 1 ) );
+
+ //treat all words as an exact search (boosts complete word like "news"
+ //from prefixes of "newspaper")
+ $must_q['bool']['should'][] = array( 'multi_match' => array(
+ 'fields' => $this->all_fields,
+ 'query' => $full_text,
+ 'operator' => 'and',
+ 'type' => 'cross_fields',
+ ) );
+
+ //always optimistically try and match the full text as a phrase
+ //prefix "the futu" should try to match "the future"
+ //otherwise the first stopword kinda breaks
+ //This also works as the prefix match for a single word "elasticsea"
+ $must_q['bool']['should'][] = array( 'multi_match' => array(
+ 'fields' => $this->phrase_fields,
+ 'query' => $full_text,
+ 'operator' => 'and',
+ 'type' => 'phrase_prefix',
+ 'max_expansions' => 100,
+ ) );
+
+ if ( $prefix_remainder ) {
+ //Multiple words found, so treat each word on its own and not just as
+ //a part of a phrase
+ //"elasticsearch lucen" => "elasticsearch" exact AND "lucen" prefix
+ $q['bool']['should'][] = array( 'bool' => array(
+ 'must' => array(
+ array( 'multi_match' => array(
+ 'fields' => $this->phrase_fields,
+ 'query' => $prefix_word,
+ 'operator' => 'and',
+ 'type' => 'phrase_prefix',
+ 'max_expansions' => 100,
+ ) ),
+ array( 'multi_match' => array(
+ 'fields' => $this->all_fields,
+ 'query' => $prefix_remainder,
+ 'operator' => 'and',
+ 'type' => 'cross_fields',
+ ) ),
+ )
+ ) );
+ }
+
+ $this->add_query( $must_q );
+ }
+
+ //Now add any boosting of the query
+ if ( ! empty( $args['boost_query_fields'] ) ) {
+ //treat all words as an exact search (boosts complete word like "news"
+ //from prefixes of "newspaper")
+ $this->add_query( array(
+ 'multi_match' => array(
+ 'fields' => $args['boost_query_fields'],
+ 'query' => $this->current_query,
+ 'operator' => $args['boost_query_operator'],
+ 'type' => $args['boost_query_type'],
+ ) ), 'should' );
+
+ //optimistically boost the full phrase prefix match
+ $this->add_query( array(
+ 'multi_match' => array(
+ 'fields' => $args['boost_query_fields'],
+ 'query' => $this->current_query,
+ 'operator' => 'and',
+ 'type' => 'phrase_prefix',
+ 'max_expansions' => 100,
+ ) ) );
+ }
+ }
+ }
+
+ /*
+ * Boost results based on the lang probability overlaps
+ *
+ * args:
+ * langs2prob: list of languages to search in with associated boosts
+ */
+ public function boost_lang_probs( $langs2prob ) {
+ foreach( $langs2prob as $l => $p ) {
+ $this->add_function( 'field_value_factor', array(
+ 'modifier' => 'none',
+ 'factor' => $p,
+ 'missing' => 0.01, //1% chance doc did not have right lang detected
+ ) );
+ }
+ }
+
+ ////////////////////////////////////
+ // Helper Methods
+
+ //Get the text after some prefix. eg @gibrown, or @"Greg Brown"
+ protected function get_fields( $field_prefix ) {
+ $regex = '/' . $field_prefix . '(("[^"]+")|([^\\p{Z}]+))/';
+ if ( preg_match_all( $regex, $this->current_query, $match ) ) {
+ return $match[1];
+ }
+ return false;
+ }
+
+ //Remove the prefix and text from the query
+ protected function remove_fields( $field_name ) {
+ $regex = '/' . $field_name . '(("[^"]+")|([^\\p{Z}]+))/';
+ $this->current_query = preg_replace( $regex, '', $this->current_query );
+ }
+
+ //Best effort string truncation that splits on word breaks
+ protected function truncate_string( $string, $limit, $break=" " ) {
+ if ( mb_strwidth( $string ) <= $limit ) {
+ return $string;
+ }
+
+ // walk backwards from $limit to find first break
+ $breakpoint = $limit;
+ $broken = false;
+ while ( $breakpoint > 0 ) {
+ if ( $break === mb_strimwidth( $string, $breakpoint, 1 ) ) {
+ $string = mb_strimwidth( $string, 0, $breakpoint );
+ $broken = true;
+ break;
+ }
+ $breakpoint--;
+ }
+ // if we weren't able to find a break, need to chop mid-word
+ if ( !$broken ) {
+ $string = mb_strimwidth( $string, 0, $limit );
+ }
+ return $string;
+ }
+
+}
diff --git a/wp-content/plugins/jetpack/_inc/lib/markdown/0-load.php b/wp-content/plugins/jetpack/_inc/lib/markdown/0-load.php
new file mode 100644
index 000000000..bf5993e33
--- /dev/null
+++ b/wp-content/plugins/jetpack/_inc/lib/markdown/0-load.php
@@ -0,0 +1,6 @@
+ tags because that's what WordPress likes.
+ - See `WPCom_GHF_Markdown_Parser::__construct()` for how the above member variable defaults are set.
diff --git a/wp-content/plugins/jetpack/_inc/lib/markdown/extra.php b/wp-content/plugins/jetpack/_inc/lib/markdown/extra.php
new file mode 100644
index 000000000..1f8f854d1
--- /dev/null
+++ b/wp-content/plugins/jetpack/_inc/lib/markdown/extra.php
@@ -0,0 +1,3207 @@
+
+#
+# Original Markdown
+# Copyright (c) 2004-2006 John Gruber
+#
+#
+# Tweaked to remove WordPress interface
+
+
+define( 'MARKDOWN_VERSION', "1.0.2" ); # 29 Nov 2013
+define( 'MARKDOWNEXTRA_VERSION', "1.2.8" ); # 29 Nov 2013
+
+
+#
+# Global default settings:
+#
+
+# Change to ">" for HTML output
+@define( 'MARKDOWN_EMPTY_ELEMENT_SUFFIX', " />");
+
+# Define the width of a tab for code blocks.
+@define( 'MARKDOWN_TAB_WIDTH', 4 );
+
+# Optional title attribute for footnote links and backlinks.
+@define( 'MARKDOWN_FN_LINK_TITLE', "" );
+@define( 'MARKDOWN_FN_BACKLINK_TITLE', "" );
+
+# Optional class attribute for footnote links and backlinks.
+@define( 'MARKDOWN_FN_LINK_CLASS', "jetpack-footnote" );
+@define( 'MARKDOWN_FN_BACKLINK_CLASS', "" );
+
+# Optional class prefix for fenced code block.
+@define( 'MARKDOWN_CODE_CLASS_PREFIX', "language-" );
+
+# Class attribute for code blocks goes on the `code` tag;
+# setting this to true will put attributes on the `pre` tag instead.
+@define( 'MARKDOWN_CODE_ATTR_ON_PRE', false );
+
+
+
+### Standard Function Interface ###
+
+@define( 'MARKDOWN_PARSER_CLASS', 'MarkdownExtra_Parser' );
+
+function Markdown($text) {
+#
+# Initialize the parser and return the result of its transform method.
+#
+ # Setup static parser variable.
+ static $parser;
+ if (!isset($parser)) {
+ $parser_class = MARKDOWN_PARSER_CLASS;
+ $parser = new $parser_class;
+ }
+
+ # Transform text using parser.
+ return $parser->transform($text);
+}
+
+/**
+ * Returns the length of $text loosely counting the number of UTF-8 characters with regular expression.
+ * Used by the Markdown_Parser class when mb_strlen is not available.
+ *
+ * @since 5.9
+ *
+ * @return string Length of the multibyte string
+ *
+ */
+function jetpack_utf8_strlen( $text ) {
+ return preg_match_all( "/[\\x00-\\xBF]|[\\xC0-\\xFF][\\x80-\\xBF]*/", $text, $m );
+}
+
+#
+# Markdown Parser Class
+#
+
+class Markdown_Parser {
+
+ ### Configuration Variables ###
+
+ # Change to ">" for HTML output.
+ public $empty_element_suffix = MARKDOWN_EMPTY_ELEMENT_SUFFIX;
+ public $tab_width = MARKDOWN_TAB_WIDTH;
+
+ # Change to `true` to disallow markup or entities.
+ public $no_markup = false;
+ public $no_entities = false;
+
+ # Predefined urls and titles for reference links and images.
+ public $predef_urls = array();
+ public $predef_titles = array();
+
+
+ ### Parser Implementation ###
+
+ # Regex to match balanced [brackets].
+ # Needed to insert a maximum bracked depth while converting to PHP.
+ public $nested_brackets_depth = 6;
+ public $nested_brackets_re;
+
+ public $nested_url_parenthesis_depth = 4;
+ public $nested_url_parenthesis_re;
+
+ # Table of hash values for escaped characters:
+ public $escape_chars = '\`*_{}[]()>#+-.!';
+ public $escape_chars_re;
+
+
+ function __construct() {
+ #
+ # Constructor function. Initialize appropriate member variables.
+ #
+ $this->_initDetab();
+ $this->prepareItalicsAndBold();
+
+ $this->nested_brackets_re =
+ str_repeat('(?>[^\[\]]+|\[', $this->nested_brackets_depth).
+ str_repeat('\])*', $this->nested_brackets_depth);
+
+ $this->nested_url_parenthesis_re =
+ str_repeat('(?>[^()\s]+|\(', $this->nested_url_parenthesis_depth).
+ str_repeat('(?>\)))*', $this->nested_url_parenthesis_depth);
+
+ $this->escape_chars_re = '['.preg_quote($this->escape_chars).']';
+
+ # Sort document, block, and span gamut in ascendent priority order.
+ asort($this->document_gamut);
+ asort($this->block_gamut);
+ asort($this->span_gamut);
+ }
+
+
+ # Internal hashes used during transformation.
+ public $urls = array();
+ public $titles = array();
+ public $html_hashes = array();
+
+ # Status flag to avoid invalid nesting.
+ public $in_anchor = false;
+
+
+ function setup() {
+ #
+ # Called before the transformation process starts to setup parser
+ # states.
+ #
+ # Clear global hashes.
+ $this->urls = $this->predef_urls;
+ $this->titles = $this->predef_titles;
+ $this->html_hashes = array();
+
+ $this->in_anchor = false;
+ }
+
+ function teardown() {
+ #
+ # Called after the transformation process to clear any variable
+ # which may be taking up memory unnecessarly.
+ #
+ $this->urls = array();
+ $this->titles = array();
+ $this->html_hashes = array();
+ }
+
+
+ function transform($text) {
+ #
+ # Main function. Performs some preprocessing on the input text
+ # and pass it through the document gamut.
+ #
+ $this->setup();
+
+ # Remove UTF-8 BOM and marker character in input, if present.
+ $text = preg_replace('{^\xEF\xBB\xBF|\x1A}', '', $text);
+
+ # Standardize line endings:
+ # DOS to Unix and Mac to Unix
+ $text = preg_replace('{\r\n?}', "\n", $text);
+
+ # Make sure $text ends with a couple of newlines:
+ $text .= "\n\n";
+
+ # Convert all tabs to spaces.
+ $text = $this->detab($text);
+
+ # Turn block-level HTML blocks into hash entries
+ $text = $this->hashHTMLBlocks($text);
+
+ # Strip any lines consisting only of spaces and tabs.
+ # This makes subsequent regexen easier to write, because we can
+ # match consecutive blank lines with /\n+/ instead of something
+ # contorted like /[ ]*\n+/ .
+ $text = preg_replace('/^[ ]+$/m', '', $text);
+
+ # Run document gamut methods.
+ foreach ($this->document_gamut as $method => $priority) {
+ $text = $this->$method($text);
+ }
+
+ $this->teardown();
+
+ return $text . "\n";
+ }
+
+ public $document_gamut = array(
+ # Strip link definitions, store in hashes.
+ "stripLinkDefinitions" => 20,
+
+ "runBasicBlockGamut" => 30,
+ );
+
+
+ function stripLinkDefinitions($text) {
+ #
+ # Strips link definitions from text, stores the URLs and titles in
+ # hash references.
+ #
+ $less_than_tab = $this->tab_width - 1;
+
+ # Link defs are in the form: ^[id]: url "optional title"
+ $text = preg_replace_callback('{
+ ^[ ]{0,'.$less_than_tab.'}\[(.+)\][ ]?: # id = $1
+ [ ]*
+ \n? # maybe *one* newline
+ [ ]*
+ (?:
+ <(.+?)> # url = $2
+ |
+ (\S+?) # url = $3
+ )
+ [ ]*
+ \n? # maybe one newline
+ [ ]*
+ (?:
+ (?<=\s) # lookbehind for whitespace
+ ["(]
+ (.*?) # title = $4
+ [")]
+ [ ]*
+ )? # title is optional
+ (?:\n+|\Z)
+ }xm',
+ array(&$this, '_stripLinkDefinitions_callback'),
+ $text);
+ return $text;
+ }
+ function _stripLinkDefinitions_callback($matches) {
+ $link_id = strtolower($matches[1]);
+ $url = $matches[2] == '' ? $matches[3] : $matches[2];
+ $this->urls[$link_id] = $url;
+ $this->titles[$link_id] =& $matches[4];
+ return ''; # String that will replace the block
+ }
+
+
+ function hashHTMLBlocks($text) {
+ if ($this->no_markup) return $text;
+
+ $less_than_tab = $this->tab_width - 1;
+
+ # Hashify HTML blocks:
+ # We only want to do this for block-level HTML tags, such as headers,
+ # lists, and tables. That's because we still want to wrap
s around
+ # "paragraphs" that are wrapped in non-block-level tags, such as anchors,
+ # phrase emphasis, and spans. The list of tags we're looking for is
+ # hard-coded:
+ #
+ # * List "a" is made of tags which can be both inline or block-level.
+ # These will be treated block-level when the start tag is alone on
+ # its line, otherwise they're not matched here and will be taken as
+ # inline later.
+ # * List "b" is made of tags which are always block-level;
+ #
+ $block_tags_a_re = 'ins|del';
+ $block_tags_b_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|'.
+ 'script|noscript|form|fieldset|iframe|math|svg|'.
+ 'article|section|nav|aside|hgroup|header|footer|'.
+ 'figure';
+
+ # Regular expression for the content of a block tag.
+ $nested_tags_level = 4;
+ $attr = '
+ (?> # optional tag attributes
+ \s # starts with whitespace
+ (?>
+ [^>"/]+ # text outside quotes
+ |
+ /+(?!>) # slash not followed by ">"
+ |
+ "[^"]*" # text inside double quotes (tolerate ">")
+ |
+ \'[^\']*\' # text inside single quotes (tolerate ">")
+ )*
+ )?
+ ';
+ $content =
+ str_repeat('
+ (?>
+ [^<]+ # content without tag
+ |
+ <\2 # nested opening tag
+ '.$attr.' # attributes
+ (?>
+ />
+ |
+ >', $nested_tags_level). # end of opening tag
+ '.*?'. # last level nested tag content
+ str_repeat('
+ \2\s*> # closing nested tag
+ )
+ |
+ <(?!/\2\s*> # other tags with a different name
+ )
+ )*',
+ $nested_tags_level);
+ $content2 = str_replace('\2', '\3', $content);
+
+ # First, look for nested blocks, e.g.:
+ #
+ #
+ # tags for inner block must be indented.
+ #
+ #
+ #
+ # The outermost tags must start at the left margin for this to match, and
+ # the inner nested divs must be indented.
+ # We need to do this before the next, more liberal match, because the next
+ # match will start at the first `
` and stop at the first `
`.
+ $text = preg_replace_callback('{(?>
+ (?>
+ (?<=\n\n) # Starting after a blank line
+ | # or
+ \A\n? # the beginning of the doc
+ )
+ ( # save in $1
+
+ # Match from `\n` to `\n`, handling nested tags
+ # in between.
+
+ [ ]{0,'.$less_than_tab.'}
+ <('.$block_tags_b_re.')# start tag = $2
+ '.$attr.'> # attributes followed by > and \n
+ '.$content.' # content, support nesting
+ \2> # the matching end tag
+ [ ]* # trailing spaces/tabs
+ (?=\n+|\Z) # followed by a newline or end of document
+
+ | # Special version for tags of group a.
+
+ [ ]{0,'.$less_than_tab.'}
+ <('.$block_tags_a_re.')# start tag = $3
+ '.$attr.'>[ ]*\n # attributes followed by >
+ '.$content2.' # content, support nesting
+ \3> # the matching end tag
+ [ ]* # trailing spaces/tabs
+ (?=\n+|\Z) # followed by a newline or end of document
+
+ | # Special case just for . It was easier to make a special
+ # case than to make the other regex more complicated.
+
+ [ ]{0,'.$less_than_tab.'}
+ <(hr) # start tag = $2
+ '.$attr.' # attributes
+ /?> # the matching end tag
+ [ ]*
+ (?=\n{2,}|\Z) # followed by a blank line or end of document
+
+ | # Special case for standalone HTML comments:
+
+ [ ]{0,'.$less_than_tab.'}
+ (?s:
+
+ )
+ [ ]*
+ (?=\n{2,}|\Z) # followed by a blank line or end of document
+
+ | # PHP and ASP-style processor instructions ( and <%)
+
+ [ ]{0,'.$less_than_tab.'}
+ (?s:
+ <([?%]) # $2
+ .*?
+ \2>
+ )
+ [ ]*
+ (?=\n{2,}|\Z) # followed by a blank line or end of document
+
+ )
+ )}Sxmi',
+ array(&$this, '_hashHTMLBlocks_callback'),
+ $text);
+
+ return $text;
+ }
+ function _hashHTMLBlocks_callback($matches) {
+ $text = $matches[1];
+ $key = $this->hashBlock($text);
+ return "\n\n$key\n\n";
+ }
+
+
+ function hashPart($text, $boundary = 'X') {
+ #
+ # Called whenever a tag must be hashed when a function insert an atomic
+ # element in the text stream. Passing $text to through this function gives
+ # a unique text-token which will be reverted back when calling unhash.
+ #
+ # The $boundary argument specify what character should be used to surround
+ # the token. By convension, "B" is used for block elements that needs not
+ # to be wrapped into paragraph tags at the end, ":" is used for elements
+ # that are word separators and "X" is used in the general case.
+ #
+ # Swap back any tag hash found in $text so we do not have to `unhash`
+ # multiple times at the end.
+ $text = $this->unhash($text);
+
+ # Then hash the block.
+ static $i = 0;
+ $key = "$boundary\x1A" . ++$i . $boundary;
+ $this->html_hashes[$key] = $text;
+ return $key; # String that will replace the tag.
+ }
+
+
+ function hashBlock($text) {
+ #
+ # Shortcut function for hashPart with block-level boundaries.
+ #
+ return $this->hashPart($text, 'B');
+ }
+
+
+ public $block_gamut = array(
+ #
+ # These are all the transformations that form block-level
+ # tags like paragraphs, headers, and list items.
+ #
+ "doHeaders" => 10,
+ "doHorizontalRules" => 20,
+
+ "doLists" => 40,
+ "doCodeBlocks" => 50,
+ "doBlockQuotes" => 60,
+ );
+
+ function runBlockGamut($text) {
+ #
+ # Run block gamut tranformations.
+ #
+ # We need to escape raw HTML in Markdown source before doing anything
+ # else. This need to be done for each block, and not only at the
+ # beginning in the Markdown function since hashed blocks can be part of
+ # list items and could have been indented. Indented blocks would have
+ # been seen as a code block in a previous pass of hashHTMLBlocks.
+ $text = $this->hashHTMLBlocks($text);
+
+ return $this->runBasicBlockGamut($text);
+ }
+
+ function runBasicBlockGamut($text) {
+ #
+ # Run block gamut tranformations, without hashing HTML blocks. This is
+ # useful when HTML blocks are known to be already hashed, like in the first
+ # whole-document pass.
+ #
+ foreach ($this->block_gamut as $method => $priority) {
+ $text = $this->$method($text);
+ }
+
+ # Finally form paragraph and restore hashed blocks.
+ $text = $this->formParagraphs($text);
+
+ return $text;
+ }
+
+
+ function doHorizontalRules($text) {
+ # Do Horizontal Rules:
+ return preg_replace(
+ '{
+ ^[ ]{0,3} # Leading space
+ ([-*_]) # $1: First marker
+ (?> # Repeated marker group
+ [ ]{0,2} # Zero, one, or two spaces.
+ \1 # Marker character
+ ){2,} # Group repeated at least twice
+ [ ]* # Tailing spaces
+ $ # End of line.
+ }mx',
+ "\n".$this->hashBlock("empty_element_suffix")."\n",
+ $text);
+ }
+
+
+ public $span_gamut = array(
+ #
+ # These are all the transformations that occur *within* block-level
+ # tags like paragraphs, headers, and list items.
+ #
+ # Process character escapes, code spans, and inline HTML
+ # in one shot.
+ "parseSpan" => -30,
+
+ # Process anchor and image tags. Images must come first,
+ # because ![foo][f] looks like an anchor.
+ "doImages" => 10,
+ "doAnchors" => 20,
+
+ # Make links out of things like ``
+ # Must come after doAnchors, because you can use < and >
+ # delimiters in inline links like [this]().
+ "doAutoLinks" => 30,
+ "encodeAmpsAndAngles" => 40,
+
+ "doItalicsAndBold" => 50,
+ "doHardBreaks" => 60,
+ );
+
+ function runSpanGamut($text) {
+ #
+ # Run span gamut tranformations.
+ #
+ foreach ($this->span_gamut as $method => $priority) {
+ $text = $this->$method($text);
+ }
+
+ return $text;
+ }
+
+
+ function doHardBreaks($text) {
+ # Do hard breaks:
+ return preg_replace_callback('/ {2,}\n/',
+ array(&$this, '_doHardBreaks_callback'), $text);
+ }
+ function _doHardBreaks_callback($matches) {
+ return $this->hashPart(" empty_element_suffix\n");
+ }
+
+
+ function doAnchors($text) {
+ #
+ # Turn Markdown link shortcuts into XHTML tags.
+ #
+ if ($this->in_anchor) return $text;
+ $this->in_anchor = true;
+
+ #
+ # First, handle reference-style links: [link text] [id]
+ #
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ \[
+ ('.$this->nested_brackets_re.') # link text = $2
+ \]
+
+ [ ]? # one optional space
+ (?:\n[ ]*)? # one optional newline followed by spaces
+
+ \[
+ (.*?) # id = $3
+ \]
+ )
+ }xs',
+ array(&$this, '_doAnchors_reference_callback'), $text);
+
+ #
+ # Next, inline-style links: [link text](url "optional title")
+ #
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ \[
+ ('.$this->nested_brackets_re.') # link text = $2
+ \]
+ \( # literal paren
+ [ \n]*
+ (?:
+ <(.+?)> # href = $3
+ |
+ ('.$this->nested_url_parenthesis_re.') # href = $4
+ )
+ [ \n]*
+ ( # $5
+ ([\'"]) # quote char = $6
+ (.*?) # Title = $7
+ \6 # matching quote
+ [ \n]* # ignore any spaces/tabs between closing quote and )
+ )? # title is optional
+ \)
+ )
+ }xs',
+ array(&$this, '_doAnchors_inline_callback'), $text);
+
+ #
+ # Last, handle reference-style shortcuts: [link text]
+ # These must come last in case you've also got [link text][1]
+ # or [link text](/foo)
+ #
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ \[
+ ([^\[\]]+) # link text = $2; can\'t contain [ or ]
+ \]
+ )
+ }xs',
+ array(&$this, '_doAnchors_reference_callback'), $text);
+
+ $this->in_anchor = false;
+ return $text;
+ }
+ function _doAnchors_reference_callback($matches) {
+ $whole_match = $matches[1];
+ $link_text = $matches[2];
+ $link_id =& $matches[3];
+
+ if ($link_id == "") {
+ # for shortcut links like [this][] or [this].
+ $link_id = $link_text;
+ }
+
+ # lower-case and turn embedded newlines into spaces
+ $link_id = strtolower($link_id);
+ $link_id = preg_replace('{[ ]?\n}', ' ', $link_id);
+
+ if (isset($this->urls[$link_id])) {
+ $url = $this->urls[$link_id];
+ $url = $this->encodeAttribute($url);
+
+ $result = "titles[$link_id] ) ) {
+ $title = $this->titles[$link_id];
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\"";
+ }
+
+ $link_text = $this->runSpanGamut($link_text);
+ $result .= ">$link_text";
+ $result = $this->hashPart($result);
+ }
+ else {
+ $result = $whole_match;
+ }
+ return $result;
+ }
+ function _doAnchors_inline_callback($matches) {
+ $whole_match = $matches[1];
+ $link_text = $this->runSpanGamut($matches[2]);
+ $url = $matches[3] == '' ? $matches[4] : $matches[3];
+ $title =& $matches[7];
+
+ $url = $this->encodeAttribute($url);
+
+ $result = "encodeAttribute($title);
+ $result .= " title=\"$title\"";
+ }
+
+ $link_text = $this->runSpanGamut($link_text);
+ $result .= ">$link_text";
+
+ return $this->hashPart($result);
+ }
+
+
+ function doImages($text) {
+ #
+ # Turn Markdown image shortcuts into tags.
+ #
+ #
+ # First, handle reference-style labeled images: ![alt text][id]
+ #
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ !\[
+ ('.$this->nested_brackets_re.') # alt text = $2
+ \]
+
+ [ ]? # one optional space
+ (?:\n[ ]*)? # one optional newline followed by spaces
+
+ \[
+ (.*?) # id = $3
+ \]
+
+ )
+ }xs',
+ array(&$this, '_doImages_reference_callback'), $text);
+
+ #
+ # Next, handle inline images: 
+ # Don't forget: encode * and _
+ #
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ !\[
+ ('.$this->nested_brackets_re.') # alt text = $2
+ \]
+ \s? # One optional whitespace character
+ \( # literal paren
+ [ \n]*
+ (?:
+ <(\S*)> # src url = $3
+ |
+ ('.$this->nested_url_parenthesis_re.') # src url = $4
+ )
+ [ \n]*
+ ( # $5
+ ([\'"]) # quote char = $6
+ (.*?) # title = $7
+ \6 # matching quote
+ [ \n]*
+ )? # title is optional
+ \)
+ )
+ }xs',
+ array(&$this, '_doImages_inline_callback'), $text);
+
+ return $text;
+ }
+ function _doImages_reference_callback($matches) {
+ $whole_match = $matches[1];
+ $alt_text = $matches[2];
+ $link_id = strtolower($matches[3]);
+
+ if ($link_id == "") {
+ $link_id = strtolower($alt_text); # for shortcut links like ![this][].
+ }
+
+ $alt_text = $this->encodeAttribute($alt_text);
+ if (isset($this->urls[$link_id])) {
+ $url = $this->encodeAttribute($this->urls[$link_id]);
+ $result = "titles[$link_id])) {
+ $title = $this->titles[$link_id];
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\"";
+ }
+ $result .= $this->empty_element_suffix;
+ $result = $this->hashPart($result);
+ }
+ else {
+ # If there's no such link ID, leave intact:
+ $result = $whole_match;
+ }
+
+ return $result;
+ }
+ function _doImages_inline_callback($matches) {
+ $whole_match = $matches[1];
+ $alt_text = $matches[2];
+ $url = $matches[3] == '' ? $matches[4] : $matches[3];
+ $title =& $matches[7];
+
+ $alt_text = $this->encodeAttribute($alt_text);
+ $url = $this->encodeAttribute($url);
+ $result = "encodeAttribute($title);
+ $result .= " title=\"$title\""; # $title already quoted
+ }
+ $result .= $this->empty_element_suffix;
+
+ return $this->hashPart($result);
+ }
+
+
+ function doHeaders($text) {
+ # Setext-style headers:
+ # Header 1
+ # ========
+ #
+ # Header 2
+ # --------
+ #
+ $text = preg_replace_callback('{ ^(.+?)[ ]*\n(=+|-+)[ ]*\n+ }mx',
+ array(&$this, '_doHeaders_callback_setext'), $text);
+
+ # atx-style headers:
+ # # Header 1
+ # ## Header 2
+ # ## Header 2 with closing hashes ##
+ # ...
+ # ###### Header 6
+ #
+ $text = preg_replace_callback('{
+ ^(\#{1,6}) # $1 = string of #\'s
+ [ ]*
+ (.+?) # $2 = Header text
+ [ ]*
+ \#* # optional closing #\'s (not counted)
+ \n+
+ }xm',
+ array(&$this, '_doHeaders_callback_atx'), $text);
+
+ return $text;
+ }
+ function _doHeaders_callback_setext($matches) {
+ # Terrible hack to check we haven't found an empty list item.
+ if ($matches[2] == '-' && preg_match('{^-(?: |$)}', $matches[1]))
+ return $matches[0];
+
+ $level = $matches[2][0] == '=' ? 1 : 2;
+ $block = "".$this->runSpanGamut($matches[1])."";
+ return "\n" . $this->hashBlock($block) . "\n\n";
+ }
+ function _doHeaders_callback_atx($matches) {
+ $level = strlen($matches[1]);
+ $block = "".$this->runSpanGamut($matches[2])."";
+ return "\n" . $this->hashBlock($block) . "\n\n";
+ }
+
+
+ function doLists($text) {
+ #
+ # Form HTML ordered (numbered) and unordered (bulleted) lists.
+ #
+ $less_than_tab = $this->tab_width - 1;
+
+ # Re-usable patterns to match list item bullets and number markers:
+ $marker_ul_re = '[*+-]';
+ $marker_ol_re = '\d+[\.]';
+ $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)";
+
+ $markers_relist = array(
+ $marker_ul_re => $marker_ol_re,
+ $marker_ol_re => $marker_ul_re,
+ );
+
+ foreach ($markers_relist as $marker_re => $other_marker_re) {
+ # Re-usable pattern to match any entirel ul or ol list:
+ $whole_list_re = '
+ ( # $1 = whole list
+ ( # $2
+ ([ ]{0,'.$less_than_tab.'}) # $3 = number of spaces
+ ('.$marker_re.') # $4 = first list item marker
+ [ ]+
+ )
+ (?s:.+?)
+ ( # $5
+ \z
+ |
+ \n{2,}
+ (?=\S)
+ (?! # Negative lookahead for another list item marker
+ [ ]*
+ '.$marker_re.'[ ]+
+ )
+ |
+ (?= # Lookahead for another kind of list
+ \n
+ \3 # Must have the same indentation
+ '.$other_marker_re.'[ ]+
+ )
+ )
+ )
+ '; // mx
+
+ # We use a different prefix before nested lists than top-level lists.
+ # See extended comment in _ProcessListItems().
+
+ if ($this->list_level) {
+ $text = preg_replace_callback('{
+ ^
+ '.$whole_list_re.'
+ }mx',
+ array(&$this, '_doLists_callback'), $text);
+ }
+ else {
+ $text = preg_replace_callback('{
+ (?:(?<=\n)\n|\A\n?) # Must eat the newline
+ '.$whole_list_re.'
+ }mx',
+ array(&$this, '_doLists_callback'), $text);
+ }
+ }
+
+ return $text;
+ }
+ function _doLists_callback($matches) {
+ # Re-usable patterns to match list item bullets and number markers:
+ $marker_ul_re = '[*+-]';
+ $marker_ol_re = '\d+[\.]';
+ $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)";
+
+ $list = $matches[1];
+ $list_type = preg_match("/$marker_ul_re/", $matches[4]) ? "ul" : "ol";
+
+ $marker_any_re = ( $list_type == "ul" ? $marker_ul_re : $marker_ol_re );
+
+ $list .= "\n";
+ $result = $this->processListItems($list, $marker_any_re);
+
+ $result = $this->hashBlock("<$list_type>\n" . $result . "$list_type>");
+ return "\n". $result ."\n\n";
+ }
+
+ public $list_level = 0;
+
+ function processListItems($list_str, $marker_any_re) {
+ #
+ # Process the contents of a single ordered or unordered list, splitting it
+ # into individual list items.
+ #
+ # The $this->list_level global keeps track of when we're inside a list.
+ # Each time we enter a list, we increment it; when we leave a list,
+ # we decrement. If it's zero, we're not in a list anymore.
+ #
+ # We do this because when we're not inside a list, we want to treat
+ # something like this:
+ #
+ # I recommend upgrading to version
+ # 8. Oops, now this line is treated
+ # as a sub-list.
+ #
+ # As a single paragraph, despite the fact that the second line starts
+ # with a digit-period-space sequence.
+ #
+ # Whereas when we're inside a list (or sub-list), that line will be
+ # treated as the start of a sub-list. What a kludge, huh? This is
+ # an aspect of Markdown's syntax that's hard to parse perfectly
+ # without resorting to mind-reading. Perhaps the solution is to
+ # change the syntax rules such that sub-lists must start with a
+ # starting cardinal number; e.g. "1." or "a.".
+
+ $this->list_level++;
+
+ # trim trailing blank lines:
+ $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str);
+
+ $list_str = preg_replace_callback('{
+ (\n)? # leading line = $1
+ (^[ ]*) # leading whitespace = $2
+ ('.$marker_any_re.' # list marker and space = $3
+ (?:[ ]+|(?=\n)) # space only required if item is not empty
+ )
+ ((?s:.*?)) # list item text = $4
+ (?:(\n+(?=\n))|\n) # tailing blank line = $5
+ (?= \n* (\z | \2 ('.$marker_any_re.') (?:[ ]+|(?=\n))))
+ }xm',
+ array(&$this, '_processListItems_callback'), $list_str);
+
+ $this->list_level--;
+ return $list_str;
+ }
+ function _processListItems_callback($matches) {
+ $item = $matches[4];
+ $leading_line =& $matches[1];
+ $leading_space =& $matches[2];
+ $marker_space = $matches[3];
+ $tailing_blank_line =& $matches[5];
+
+ if ($leading_line || $tailing_blank_line ||
+ preg_match('/\n{2,}/', $item))
+ {
+ # Replace marker with the appropriate whitespace indentation
+ $item = $leading_space . str_repeat(' ', strlen($marker_space)) . $item;
+ $item = $this->runBlockGamut($this->outdent($item)."\n");
+ }
+ else {
+ # Recursion for sub-lists:
+ $item = $this->doLists($this->outdent($item));
+ $item = preg_replace('/\n+$/', '', $item);
+ $item = $this->runSpanGamut($item);
+ }
+
+ return "
" . $item . "
\n";
+ }
+
+
+ function doCodeBlocks($text) {
+ #
+ # Process Markdown `
` blocks.
+ #
+ $text = preg_replace_callback('{
+ (?:\n\n|\A\n?)
+ ( # $1 = the code block -- one or more lines, starting with a space/tab
+ (?>
+ [ ]{'.$this->tab_width.'} # Lines must start with a tab or a tab-width of spaces
+ .*\n+
+ )+
+ )
+ ((?=^[ ]{0,'.$this->tab_width.'}\S)|\Z) # Lookahead for non-space at line-start, or end of doc
+ }xm',
+ array(&$this, '_doCodeBlocks_callback'), $text);
+
+ return $text;
+ }
+ function _doCodeBlocks_callback($matches) {
+ $codeblock = $matches[1];
+
+ $codeblock = $this->outdent($codeblock);
+ $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);
+
+ # trim leading newlines and trailing newlines
+ $codeblock = preg_replace('/\A\n+|\n+\z/', '', $codeblock);
+
+ $codeblock = "
$codeblock\n
";
+ return "\n\n".$this->hashBlock($codeblock)."\n\n";
+ }
+
+
+ function makeCodeSpan($code) {
+ #
+ # Create a code span markup for $code. Called from handleSpanToken.
+ #
+ $code = htmlspecialchars(trim($code), ENT_NOQUOTES);
+ return $this->hashPart("$code");
+ }
+
+
+ public $em_relist = array(
+ '' => '(?:(? '(?<=\S|^)(? '(?<=\S|^)(? '(?:(? '(?<=\S|^)(? '(?<=\S|^)(? '(?:(? '(?<=\S|^)(? '(?<=\S|^)(?em_relist as $em => $em_re) {
+ foreach ($this->strong_relist as $strong => $strong_re) {
+ # Construct list of allowed token expressions.
+ $token_relist = array();
+ if (isset($this->em_strong_relist["$em$strong"])) {
+ $token_relist[] = $this->em_strong_relist["$em$strong"];
+ }
+ $token_relist[] = $em_re;
+ $token_relist[] = $strong_re;
+
+ # Construct master expression from list.
+ $token_re = '{('. implode('|', $token_relist) .')}';
+ $this->em_strong_prepared_relist["$em$strong"] = $token_re;
+ }
+ }
+ }
+
+ function doItalicsAndBold($text) {
+ $token_stack = array('');
+ $text_stack = array('');
+ $em = '';
+ $strong = '';
+ $tree_char_em = false;
+
+ while (1) {
+ #
+ # Get prepared regular expression for seraching emphasis tokens
+ # in current context.
+ #
+ $token_re = $this->em_strong_prepared_relist["$em$strong"];
+
+ #
+ # Each loop iteration search for the next emphasis token.
+ # Each token is then passed to handleSpanToken.
+ #
+ $parts = preg_split($token_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE);
+ $text_stack[0] .= $parts[0];
+ $token =& $parts[1];
+ $text =& $parts[2];
+
+ if (empty($token)) {
+ # Reached end of text span: empty stack without emitting.
+ # any more emphasis.
+ while ($token_stack[0]) {
+ $text_stack[1] .= array_shift($token_stack);
+ $text_stack[0] .= array_shift($text_stack);
+ }
+ break;
+ }
+
+ $token_len = strlen($token);
+ if ($tree_char_em) {
+ # Reached closing marker while inside a three-char emphasis.
+ if ($token_len == 3) {
+ # Three-char closing marker, close em and strong.
+ array_shift($token_stack);
+ $span = array_shift($text_stack);
+ $span = $this->runSpanGamut($span);
+ $span = "$span";
+ $text_stack[0] .= $this->hashPart($span);
+ $em = '';
+ $strong = '';
+ } else {
+ # Other closing marker: close one em or strong and
+ # change current token state to match the other
+ $token_stack[0] = str_repeat($token[0], 3-$token_len);
+ $tag = $token_len == 2 ? "strong" : "em";
+ $span = $text_stack[0];
+ $span = $this->runSpanGamut($span);
+ $span = "<$tag>$span$tag>";
+ $text_stack[0] = $this->hashPart($span);
+ $$tag = ''; # $$tag stands for $em or $strong
+ }
+ $tree_char_em = false;
+ } else if ($token_len == 3) {
+ if ($em) {
+ # Reached closing marker for both em and strong.
+ # Closing strong marker:
+ for ($i = 0; $i < 2; ++$i) {
+ $shifted_token = array_shift($token_stack);
+ $tag = strlen($shifted_token) == 2 ? "strong" : "em";
+ $span = array_shift($text_stack);
+ $span = $this->runSpanGamut($span);
+ $span = "<$tag>$span$tag>";
+ $text_stack[0] .= $this->hashPart($span);
+ $$tag = ''; # $$tag stands for $em or $strong
+ }
+ } else {
+ # Reached opening three-char emphasis marker. Push on token
+ # stack; will be handled by the special condition above.
+ $em = $token[0];
+ $strong = "$em$em";
+ array_unshift($token_stack, $token);
+ array_unshift($text_stack, '');
+ $tree_char_em = true;
+ }
+ } else if ($token_len == 2) {
+ if ($strong) {
+ # Unwind any dangling emphasis marker:
+ if (strlen($token_stack[0]) == 1) {
+ $text_stack[1] .= array_shift($token_stack);
+ $text_stack[0] .= array_shift($text_stack);
+ }
+ # Closing strong marker:
+ array_shift($token_stack);
+ $span = array_shift($text_stack);
+ $span = $this->runSpanGamut($span);
+ $span = "$span";
+ $text_stack[0] .= $this->hashPart($span);
+ $strong = '';
+ } else {
+ array_unshift($token_stack, $token);
+ array_unshift($text_stack, '');
+ $strong = $token;
+ }
+ } else {
+ # Here $token_len == 1
+ if ($em) {
+ if (strlen($token_stack[0]) == 1) {
+ # Closing emphasis marker:
+ array_shift($token_stack);
+ $span = array_shift($text_stack);
+ $span = $this->runSpanGamut($span);
+ $span = "$span";
+ $text_stack[0] .= $this->hashPart($span);
+ $em = '';
+ } else {
+ $text_stack[0] .= $token;
+ }
+ } else {
+ array_unshift($token_stack, $token);
+ array_unshift($text_stack, '');
+ $em = $token;
+ }
+ }
+ }
+ return $text_stack[0];
+ }
+
+
+ function doBlockQuotes($text) {
+ $text = preg_replace_callback('/
+ ( # Wrap whole match in $1
+ (?>
+ ^[ ]*>[ ]? # ">" at the start of a line
+ .+\n # rest of the first line
+ (.+\n)* # subsequent consecutive lines
+ \n* # blanks
+ )+
+ )
+ /xm',
+ array(&$this, '_doBlockQuotes_callback'), $text);
+
+ return $text;
+ }
+ function _doBlockQuotes_callback($matches) {
+ $bq = $matches[1];
+ # trim one level of quoting - trim whitespace-only lines
+ $bq = preg_replace('/^[ ]*>[ ]?|^[ ]+$/m', '', $bq);
+ $bq = $this->runBlockGamut($bq); # recurse
+
+ $bq = preg_replace('/^/m', " ", $bq);
+ # These leading spaces cause problem with
content,
+ # so we need to fix that:
+ $bq = preg_replace_callback('{(\s*
+ #
+ # Based by a filter by Matthew Wickline, posted to BBEdit-Talk.
+ # With some optimizations by Milian Wolff.
+ #
+ $addr = "mailto:" . $addr;
+ $chars = preg_split('/(? $char) {
+ $ord = ord($char);
+ # Ignore non-ascii chars.
+ if ($ord < 128) {
+ $r = ($seed * (1 + $key)) % 100; # Pseudo-random function.
+ # roughly 10% raw, 45% hex, 45% dec
+ # '@' *must* be encoded. I insist.
+ if ($r > 90 && $char != '@') /* do nothing */;
+ else if ($r < 45) $chars[$key] = ''.dechex($ord).';';
+ else $chars[$key] = ''.$ord.';';
+ }
+ }
+
+ $addr = implode('', $chars);
+ $text = implode('', array_slice($chars, 7)); # text without `mailto:`
+ $addr = "$text";
+
+ return $addr;
+ }
+
+
+ function parseSpan($str) {
+ #
+ # Take the string $str and parse it into tokens, hashing embedded HTML,
+ # escaped characters and handling code spans.
+ #
+ $output = '';
+
+ $span_re = '{
+ (
+ \\\\'.$this->escape_chars_re.'
+ |
+ (?no_markup ? '' : '
+ |
+ # comment
+ |
+ <\?.*?\?> | <%.*?%> # processing instruction
+ |
+ <[!$]?[-a-zA-Z0-9:_]+ # regular tags
+ (?>
+ \s
+ (?>[^"\'>]+|"[^"]*"|\'[^\']*\')*
+ )?
+ >
+ |
+ <[-a-zA-Z0-9:_]+\s*/> # xml-style empty tag
+ |
+ [-a-zA-Z0-9:_]+\s*> # closing tag
+ ').'
+ )
+ }xs';
+
+ while (1) {
+ #
+ # Each loop iteration search for either the next tag, the next
+ # openning code span marker, or the next escaped character.
+ # Each token is then passed to handleSpanToken.
+ #
+ $parts = preg_split($span_re, $str, 2, PREG_SPLIT_DELIM_CAPTURE);
+
+ # Create token from text preceding tag.
+ if ($parts[0] != "") {
+ $output .= $parts[0];
+ }
+
+ # Check if we reach the end.
+ if (isset($parts[1])) {
+ $output .= $this->handleSpanToken($parts[1], $parts[2]);
+ $str = $parts[2];
+ }
+ else {
+ break;
+ }
+ }
+
+ return $output;
+ }
+
+
+ function handleSpanToken($token, &$str) {
+ #
+ # Handle $token provided by parseSpan by determining its nature and
+ # returning the corresponding value that should replace it.
+ #
+ switch ($token[0]) {
+ case "\\":
+ return $this->hashPart("". ord($token[1]). ";");
+ case "`":
+ # Search for end marker in remaining text.
+ if (preg_match('/^(.*?[^`])'.preg_quote($token).'(?!`)(.*)$/sm',
+ $str, $matches))
+ {
+ $str = $matches[2];
+ $codespan = $this->makeCodeSpan($matches[1]);
+ return $this->hashPart($codespan);
+ }
+ return $token; // return as text since no ending marker found.
+ default:
+ return $this->hashPart($token);
+ }
+ }
+
+
+ function outdent($text) {
+ #
+ # Remove one level of line-leading tabs or spaces
+ #
+ return preg_replace('/^(\t|[ ]{1,'.$this->tab_width.'})/m', '', $text);
+ }
+
+
+ # String length function for detab. `_initDetab` will create a function to
+ # hanlde UTF-8 if the default function does not exist.
+ public $utf8_strlen = 'mb_strlen';
+
+ function detab($text) {
+ #
+ # Replace tabs with the appropriate amount of space.
+ #
+ # For each line we separate the line in blocks delemited by
+ # tab characters. Then we reconstruct every line by adding the
+ # appropriate number of space between each blocks.
+
+ $text = preg_replace_callback('/^.*\t.*$/m',
+ array(&$this, '_detab_callback'), $text);
+
+ return $text;
+ }
+ function _detab_callback($matches) {
+ $line = $matches[0];
+ $strlen = $this->utf8_strlen; # strlen function for UTF-8.
+
+ # Split in blocks.
+ $blocks = explode("\t", $line);
+ # Add each blocks to the line.
+ $line = $blocks[0];
+ unset($blocks[0]); # Do not add first block twice.
+ foreach ($blocks as $block) {
+ # Calculate amount of space, insert spaces, insert block.
+ $amount = $this->tab_width -
+ $strlen($line, 'UTF-8') % $this->tab_width;
+ $line .= str_repeat(" ", $amount) . $block;
+ }
+ return $line;
+ }
+ function _initDetab() {
+ #
+ # Check for the availability of the function in the `utf8_strlen` property
+ # (initially `mb_strlen`). If the function is not available, use jetpack_utf8_strlen
+ # that will loosely count the number of UTF-8 characters with a
+ # regular expression.
+ #
+ if ( function_exists( $this->utf8_strlen ) ) {
+ return;
+ }
+ $this->utf8_strlen = 'jetpack_utf8_strlen';
+ }
+
+
+ function unhash($text) {
+ #
+ # Swap back in all the tags hashed by _HashHTMLBlocks.
+ #
+ return preg_replace_callback('/(.)\x1A[0-9]+\1/',
+ array(&$this, '_unhash_callback'), $text);
+ }
+ function _unhash_callback($matches) {
+ return $this->html_hashes[$matches[0]];
+ }
+
+}
+
+
+#
+# Markdown Extra Parser Class
+#
+
+class MarkdownExtra_Parser extends Markdown_Parser {
+
+ ### Configuration Variables ###
+
+ # Prefix for footnote ids.
+ public $fn_id_prefix = "";
+
+ # Optional title attribute for footnote links and backlinks.
+ public $fn_link_title = MARKDOWN_FN_LINK_TITLE;
+ public $fn_backlink_title = MARKDOWN_FN_BACKLINK_TITLE;
+
+ # Optional class attribute for footnote links and backlinks.
+ public $fn_link_class = MARKDOWN_FN_LINK_CLASS;
+ public $fn_backlink_class = MARKDOWN_FN_BACKLINK_CLASS;
+
+ # Optional class prefix for fenced code block.
+ public $code_class_prefix = MARKDOWN_CODE_CLASS_PREFIX;
+ # Class attribute for code blocks goes on the `code` tag;
+ # setting this to true will put attributes on the `pre` tag instead.
+ public $code_attr_on_pre = MARKDOWN_CODE_ATTR_ON_PRE;
+
+ # Predefined abbreviations.
+ public $predef_abbr = array();
+
+
+ ### Parser Implementation ###
+
+ function __construct() {
+ #
+ # Constructor function. Initialize the parser object.
+ #
+ # Add extra escapable characters before parent constructor
+ # initialize the table.
+ $this->escape_chars .= ':|';
+
+ # Insert extra document, block, and span transformations.
+ # Parent constructor will do the sorting.
+ $this->document_gamut += array(
+ "doFencedCodeBlocks" => 5,
+ "stripFootnotes" => 15,
+ "stripAbbreviations" => 25,
+ "appendFootnotes" => 50,
+ );
+ $this->block_gamut += array(
+ "doFencedCodeBlocks" => 5,
+ "doTables" => 15,
+ "doDefLists" => 45,
+ );
+ $this->span_gamut += array(
+ "doFootnotes" => 5,
+ "doAbbreviations" => 70,
+ );
+
+ parent::__construct();
+ }
+
+
+ # Extra variables used during extra transformations.
+ public $footnotes = array();
+ public $footnotes_ordered = array();
+ public $footnotes_ref_count = array();
+ public $footnotes_numbers = array();
+ public $abbr_desciptions = array();
+ public $abbr_word_re = '';
+
+ # Give the current footnote number.
+ public $footnote_counter = 1;
+
+
+ function setup() {
+ #
+ # Setting up Extra-specific variables.
+ #
+ parent::setup();
+
+ $this->footnotes = array();
+ $this->footnotes_ordered = array();
+ $this->footnotes_ref_count = array();
+ $this->footnotes_numbers = array();
+ $this->abbr_desciptions = array();
+ $this->abbr_word_re = '';
+ $this->footnote_counter = 1;
+
+ foreach ($this->predef_abbr as $abbr_word => $abbr_desc) {
+ if ($this->abbr_word_re)
+ $this->abbr_word_re .= '|';
+ $this->abbr_word_re .= preg_quote($abbr_word);
+ $this->abbr_desciptions[$abbr_word] = trim($abbr_desc);
+ }
+ }
+
+ function teardown() {
+ #
+ # Clearing Extra-specific variables.
+ #
+ $this->footnotes = array();
+ $this->footnotes_ordered = array();
+ $this->footnotes_ref_count = array();
+ $this->footnotes_numbers = array();
+ $this->abbr_desciptions = array();
+ $this->abbr_word_re = '';
+
+ parent::teardown();
+ }
+
+
+ ### Extra Attribute Parser ###
+
+ # Expression to use to catch attributes (includes the braces)
+ public $id_class_attr_catch_re = '\{((?:[ ]*[#.][-_:a-zA-Z0-9]+){1,})[ ]*\}';
+ # Expression to use when parsing in a context when no capture is desired
+ public $id_class_attr_nocatch_re = '\{(?:[ ]*[#.][-_:a-zA-Z0-9]+){1,}[ ]*\}';
+
+ function doExtraAttributes($tag_name, $attr) {
+ #
+ # Parse attributes caught by the $this->id_class_attr_catch_re expression
+ # and return the HTML-formatted list of attributes.
+ #
+ # Currently supported attributes are .class and #id.
+ #
+ if (empty($attr)) return "";
+
+ # Split on components
+ preg_match_all('/[#.][-_:a-zA-Z0-9]+/', $attr, $matches);
+ $elements = $matches[0];
+
+ # handle classes and ids (only first id taken into account)
+ $classes = array();
+ $id = false;
+ foreach ($elements as $element) {
+ if ($element[0] == '.') {
+ $classes[] = substr($element, 1);
+ } else if ($element[0] == '#') {
+ if ($id === false) $id = substr($element, 1);
+ }
+ }
+
+ # compose attributes as string
+ $attr_str = "";
+ if (!empty($id)) {
+ $attr_str .= ' id="'.$id.'"';
+ }
+ if (!empty($classes)) {
+ $attr_str .= ' class="'.implode(" ", $classes).'"';
+ }
+ return $attr_str;
+ }
+
+
+ function stripLinkDefinitions($text) {
+ #
+ # Strips link definitions from text, stores the URLs and titles in
+ # hash references.
+ #
+ $less_than_tab = $this->tab_width - 1;
+
+ # Link defs are in the form: ^[id]: url "optional title"
+ $text = preg_replace_callback('{
+ ^[ ]{0,'.$less_than_tab.'}\[(.+)\][ ]?: # id = $1
+ [ ]*
+ \n? # maybe *one* newline
+ [ ]*
+ (?:
+ <(.+?)> # url = $2
+ |
+ (\S+?) # url = $3
+ )
+ [ ]*
+ \n? # maybe one newline
+ [ ]*
+ (?:
+ (?<=\s) # lookbehind for whitespace
+ ["(]
+ (.*?) # title = $4
+ [")]
+ [ ]*
+ )? # title is optional
+ (?:[ ]* '.$this->id_class_attr_catch_re.' )? # $5 = extra id & class attr
+ (?:\n+|\Z)
+ }xm',
+ array(&$this, '_stripLinkDefinitions_callback'),
+ $text);
+ return $text;
+ }
+ function _stripLinkDefinitions_callback($matches) {
+ $link_id = strtolower($matches[1]);
+ $url = $matches[2] == '' ? $matches[3] : $matches[2];
+ $this->urls[$link_id] = $url;
+ $this->titles[$link_id] =& $matches[4];
+ $this->ref_attr[$link_id] = $this->doExtraAttributes("", $dummy =& $matches[5]);
+ return ''; # String that will replace the block
+ }
+
+
+ ### HTML Block Parser ###
+
+ # Tags that are always treated as block tags:
+ public $block_tags_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|form|fieldset|iframe|hr|legend|article|section|nav|aside|hgroup|header|footer|figcaption';
+
+ # Tags treated as block tags only if the opening tag is alone on its line:
+ public $context_block_tags_re = 'script|noscript|ins|del|iframe|object|source|track|param|math|svg|canvas|audio|video';
+
+ # Tags where markdown="1" default to span mode:
+ public $contain_span_tags_re = 'p|h[1-6]|li|dd|dt|td|th|legend|address';
+
+ # Tags which must not have their contents modified, no matter where
+ # they appear:
+ public $clean_tags_re = 'script|math|svg';
+
+ # Tags that do not need to be closed.
+ public $auto_close_tags_re = 'hr|img|param|source|track';
+
+
+ function hashHTMLBlocks($text) {
+ #
+ # Hashify HTML Blocks and "clean tags".
+ #
+ # We only want to do this for block-level HTML tags, such as headers,
+ # lists, and tables. That's because we still want to wrap
s around
+ # "paragraphs" that are wrapped in non-block-level tags, such as anchors,
+ # phrase emphasis, and spans. The list of tags we're looking for is
+ # hard-coded.
+ #
+ # This works by calling _HashHTMLBlocks_InMarkdown, which then calls
+ # _HashHTMLBlocks_InHTML when it encounter block tags. When the markdown="1"
+ # attribute is found within a tag, _HashHTMLBlocks_InHTML calls back
+ # _HashHTMLBlocks_InMarkdown to handle the Markdown syntax within the tag.
+ # These two functions are calling each other. It's recursive!
+ #
+ if ($this->no_markup) return $text;
+
+ #
+ # Call the HTML-in-Markdown hasher.
+ #
+ list($text, ) = $this->_hashHTMLBlocks_inMarkdown($text);
+
+ return $text;
+ }
+ function _hashHTMLBlocks_inMarkdown($text, $indent = 0,
+ $enclosing_tag_re = '', $span = false)
+ {
+ #
+ # Parse markdown text, calling _HashHTMLBlocks_InHTML for block tags.
+ #
+ # * $indent is the number of space to be ignored when checking for code
+ # blocks. This is important because if we don't take the indent into
+ # account, something like this (which looks right) won't work as expected:
+ #
+ #
+ #
+ # Hello World. <-- Is this a Markdown code block or text?
+ #
<-- Is this a Markdown code block or a real tag?
+ #
+ #
+ # If you don't like this, just don't indent the tag on which
+ # you apply the markdown="1" attribute.
+ #
+ # * If $enclosing_tag_re is not empty, stops at the first unmatched closing
+ # tag with that name. Nested tags supported.
+ #
+ # * If $span is true, text inside must treated as span. So any double
+ # newline will be replaced by a single newline so that it does not create
+ # paragraphs.
+ #
+ # Returns an array of that form: ( processed text , remaining text )
+ #
+ if ($text === '') return array('', '');
+
+ # Regex to check for the presence of newlines around a block tag.
+ $newline_before_re = '/(?:^\n?|\n\n)*$/';
+ $newline_after_re =
+ '{
+ ^ # Start of text following the tag.
+ (?>[ ]*)? # Optional comment.
+ [ ]*\n # Must be followed by newline.
+ }xs';
+
+ # Regex to match any tag.
+ $block_tag_re =
+ '{
+ ( # $2: Capture whole tag.
+ ? # Any opening or closing tag.
+ (?> # Tag name.
+ '.$this->block_tags_re.' |
+ '.$this->context_block_tags_re.' |
+ '.$this->clean_tags_re.' |
+ (?!\s)'.$enclosing_tag_re.'
+ )
+ (?:
+ (?=[\s"\'/a-zA-Z0-9]) # Allowed characters after tag name.
+ (?>
+ ".*?" | # Double quotes (can contain `>`)
+ \'.*?\' | # Single quotes (can contain `>`)
+ .+? # Anything but quotes and `>`.
+ )*?
+ )?
+ > # End of tag.
+ |
+ # HTML Comment
+ |
+ <\?.*?\?> | <%.*?%> # Processing instruction
+ |
+ # CData Block
+ '. ( !$span ? ' # If not in span.
+ |
+ # Indented code block
+ (?: ^[ ]*\n | ^ | \n[ ]*\n )
+ [ ]{'.($indent+4).'}[^\n]* \n
+ (?>
+ (?: [ ]{'.($indent+4).'}[^\n]* | [ ]* ) \n
+ )*
+ |
+ # Fenced code block marker
+ (?<= ^ | \n )
+ [ ]{0,'.($indent+3).'}(?:~{3,}|`{3,})
+ [ ]*
+ (?:
+ \.?[-_:a-zA-Z0-9]+ # standalone class name
+ |
+ '.$this->id_class_attr_nocatch_re.' # extra attributes
+ )?
+ [ ]*
+ (?= \n )
+ ' : '' ). ' # End (if not is span).
+ |
+ # Code span marker
+ # Note, this regex needs to go after backtick fenced
+ # code blocks but it should also be kept outside of the
+ # "if not in span" condition adding backticks to the parser
+ `+
+ )
+ }xs';
+
+
+ $depth = 0; # Current depth inside the tag tree.
+ $parsed = ""; # Parsed text that will be returned.
+
+ #
+ # Loop through every tag until we find the closing tag of the parent
+ # or loop until reaching the end of text if no parent tag specified.
+ #
+ do {
+ #
+ # Split the text using the first $tag_match pattern found.
+ # Text before pattern will be first in the array, text after
+ # pattern will be at the end, and between will be any catches made
+ # by the pattern.
+ #
+ $parts = preg_split($block_tag_re, $text, 2,
+ PREG_SPLIT_DELIM_CAPTURE);
+
+ # If in Markdown span mode, add a empty-string span-level hash
+ # after each newline to prevent triggering any block element.
+ if ($span) {
+ $void = $this->hashPart("", ':');
+ $newline = "$void\n";
+ $parts[0] = $void . str_replace("\n", $newline, $parts[0]) . $void;
+ }
+
+ $parsed .= $parts[0]; # Text before current tag.
+
+ # If end of $text has been reached. Stop loop.
+ if (count($parts) < 3) {
+ $text = "";
+ break;
+ }
+
+ $tag = $parts[1]; # Tag to handle.
+ $text = $parts[2]; # Remaining text after current tag.
+ $tag_re = preg_quote($tag); # For use in a regular expression.
+
+ #
+ # Check for: Fenced code block marker.
+ # Note: need to recheck the whole tag to disambiguate backtick
+ # fences from code spans
+ #
+ if (preg_match('{^\n?([ ]{0,'.($indent+3).'})(~{3,}|`{3,})[ ]*(?:\.?[-_:a-zA-Z0-9]+|'.$this->id_class_attr_nocatch_re.')?[ ]*\n?$}', $tag, $capture)) {
+ # Fenced code block marker: find matching end marker.
+ $fence_indent = strlen($capture[1]); # use captured indent in re
+ $fence_re = $capture[2]; # use captured fence in re
+ if (preg_match('{^(?>.*\n)*?[ ]{'.($fence_indent).'}'.$fence_re.'[ ]*(?:\n|$)}', $text,
+ $matches))
+ {
+ # End marker found: pass text unchanged until marker.
+ $parsed .= $tag . $matches[0];
+ $text = substr($text, strlen($matches[0]));
+ }
+ else {
+ # No end marker: just skip it.
+ $parsed .= $tag;
+ }
+ }
+ #
+ # Check for: Indented code block.
+ #
+ else if ($tag[0] == "\n" || $tag[0] == " ") {
+ # Indented code block: pass it unchanged, will be handled
+ # later.
+ $parsed .= $tag;
+ }
+ #
+ # Check for: Code span marker
+ # Note: need to check this after backtick fenced code blocks
+ #
+ else if ($tag[0] == "`") {
+ # Find corresponding end marker.
+ $tag_re = preg_quote($tag);
+ if (preg_match('{^(?>.+?|\n(?!\n))*?(?block_tags_re.')\b}', $tag) ||
+ ( preg_match('{^<(?:'.$this->context_block_tags_re.')\b}', $tag) &&
+ preg_match($newline_before_re, $parsed) &&
+ preg_match($newline_after_re, $text) )
+ )
+ {
+ # Need to parse tag and following text using the HTML parser.
+ list($block_text, $text) =
+ $this->_hashHTMLBlocks_inHTML($tag . $text, "hashBlock", true);
+
+ # Make sure it stays outside of any paragraph by adding newlines.
+ $parsed .= "\n\n$block_text\n\n";
+ }
+ #
+ # Check for: Clean tag (like script, math)
+ # HTML Comments, processing instructions.
+ #
+ else if (preg_match('{^<(?:'.$this->clean_tags_re.')\b}', $tag) ||
+ $tag[1] == '!' || $tag[1] == '?')
+ {
+ # Need to parse tag and following text using the HTML parser.
+ # (don't check for markdown attribute)
+ list($block_text, $text) =
+ $this->_hashHTMLBlocks_inHTML($tag . $text, "hashClean", false);
+
+ $parsed .= $block_text;
+ }
+ #
+ # Check for: Tag with same name as enclosing tag.
+ #
+ else if ($enclosing_tag_re !== '' &&
+ # Same name as enclosing tag.
+ preg_match('{^?(?:'.$enclosing_tag_re.')\b}', $tag))
+ {
+ #
+ # Increase/decrease nested tag count.
+ #
+ if ($tag[1] == '/') $depth--;
+ else if ($tag[strlen($tag)-2] != '/') $depth++;
+
+ if ($depth < 0) {
+ #
+ # Going out of parent element. Clean up and break so we
+ # return to the calling function.
+ #
+ $text = $tag . $text;
+ break;
+ }
+
+ $parsed .= $tag;
+ }
+ else {
+ $parsed .= $tag;
+ }
+ } while ($depth >= 0);
+
+ return array($parsed, $text);
+ }
+ function _hashHTMLBlocks_inHTML($text, $hash_method, $md_attr) {
+ #
+ # Parse HTML, calling _HashHTMLBlocks_InMarkdown for block tags.
+ #
+ # * Calls $hash_method to convert any blocks.
+ # * Stops when the first opening tag closes.
+ # * $md_attr indicate if the use of the `markdown="1"` attribute is allowed.
+ # (it is not inside clean tags)
+ #
+ # Returns an array of that form: ( processed text , remaining text )
+ #
+ if ($text === '') return array('', '');
+
+ # Regex to match `markdown` attribute inside of a tag.
+ $markdown_attr_re = '
+ {
+ \s* # Eat whitespace before the `markdown` attribute
+ markdown
+ \s*=\s*
+ (?>
+ (["\']) # $1: quote delimiter
+ (.*?) # $2: attribute value
+ \1 # matching delimiter
+ |
+ ([^\s>]*) # $3: unquoted attribute value
+ )
+ () # $4: make $3 always defined (avoid warnings)
+ }xs';
+
+ # Regex to match any tag.
+ $tag_re = '{
+ ( # $2: Capture whole tag.
+ ? # Any opening or closing tag.
+ [\w:$]+ # Tag name.
+ (?:
+ (?=[\s"\'/a-zA-Z0-9]) # Allowed characters after tag name.
+ (?>
+ ".*?" | # Double quotes (can contain `>`)
+ \'.*?\' | # Single quotes (can contain `>`)
+ .+? # Anything but quotes and `>`.
+ )*?
+ )?
+ > # End of tag.
+ |
+ # HTML Comment
+ |
+ <\?.*?\?> | <%.*?%> # Processing instruction
+ |
+ # CData Block
+ )
+ }xs';
+
+ $original_text = $text; # Save original text in case of faliure.
+
+ $depth = 0; # Current depth inside the tag tree.
+ $block_text = ""; # Temporary text holder for current text.
+ $parsed = ""; # Parsed text that will be returned.
+
+ #
+ # Get the name of the starting tag.
+ # (This pattern makes $base_tag_name_re safe without quoting.)
+ #
+ if (preg_match('/^<([\w:$]*)\b/', $text, $matches))
+ $base_tag_name_re = $matches[1];
+
+ #
+ # Loop through every tag until we find the corresponding closing tag.
+ #
+ do {
+ #
+ # Split the text using the first $tag_match pattern found.
+ # Text before pattern will be first in the array, text after
+ # pattern will be at the end, and between will be any catches made
+ # by the pattern.
+ #
+ $parts = preg_split($tag_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE);
+
+ if (count($parts) < 3) {
+ #
+ # End of $text reached with unbalenced tag(s).
+ # In that case, we return original text unchanged and pass the
+ # first character as filtered to prevent an infinite loop in the
+ # parent function.
+ #
+ return array($original_text[0], substr($original_text, 1));
+ }
+
+ $block_text .= $parts[0]; # Text before current tag.
+ $tag = $parts[1]; # Tag to handle.
+ $text = $parts[2]; # Remaining text after current tag.
+
+ #
+ # Check for: Auto-close tag (like )
+ # Comments and Processing Instructions.
+ #
+ if (preg_match('{^?(?:'.$this->auto_close_tags_re.')\b}', $tag) ||
+ $tag[1] == '!' || $tag[1] == '?')
+ {
+ # Just add the tag to the block as if it was text.
+ $block_text .= $tag;
+ }
+ else {
+ #
+ # Increase/decrease nested tag count. Only do so if
+ # the tag's name match base tag's.
+ #
+ if (preg_match('{^?'.$base_tag_name_re.'\b}', $tag)) {
+ if ($tag[1] == '/') $depth--;
+ else if ($tag[strlen($tag)-2] != '/') $depth++;
+ }
+
+ #
+ # Check for `markdown="1"` attribute and handle it.
+ #
+ if ($md_attr &&
+ preg_match($markdown_attr_re, $tag, $attr_m) &&
+ preg_match('/^1|block|span$/', $attr_m[2] . $attr_m[3]))
+ {
+ # Remove `markdown` attribute from opening tag.
+ $tag = preg_replace($markdown_attr_re, '', $tag);
+
+ # Check if text inside this tag must be parsed in span mode.
+ $this->mode = $attr_m[2] . $attr_m[3];
+ $span_mode = $this->mode == 'span' || $this->mode != 'block' &&
+ preg_match('{^<(?:'.$this->contain_span_tags_re.')\b}', $tag);
+
+ # Calculate indent before tag.
+ if (preg_match('/(?:^|\n)( *?)(?! ).*?$/', $block_text, $matches)) {
+ $strlen = $this->utf8_strlen;
+ $indent = $strlen($matches[1], 'UTF-8');
+ } else {
+ $indent = 0;
+ }
+
+ # End preceding block with this tag.
+ $block_text .= $tag;
+ $parsed .= $this->$hash_method($block_text);
+
+ # Get enclosing tag name for the ParseMarkdown function.
+ # (This pattern makes $tag_name_re safe without quoting.)
+ preg_match('/^<([\w:$]*)\b/', $tag, $matches);
+ $tag_name_re = $matches[1];
+
+ # Parse the content using the HTML-in-Markdown parser.
+ list ($block_text, $text)
+ = $this->_hashHTMLBlocks_inMarkdown($text, $indent,
+ $tag_name_re, $span_mode);
+
+ # Outdent markdown text.
+ if ($indent > 0) {
+ $block_text = preg_replace("/^[ ]{1,$indent}/m", "",
+ $block_text);
+ }
+
+ # Append tag content to parsed text.
+ if (!$span_mode) $parsed .= "\n\n$block_text\n\n";
+ else $parsed .= "$block_text";
+
+ # Start over with a new block.
+ $block_text = "";
+ }
+ else $block_text .= $tag;
+ }
+
+ } while ($depth > 0);
+
+ #
+ # Hash last block text that wasn't processed inside the loop.
+ #
+ $parsed .= $this->$hash_method($block_text);
+
+ return array($parsed, $text);
+ }
+
+
+ function hashClean($text) {
+ #
+ # Called whenever a tag must be hashed when a function inserts a "clean" tag
+ # in $text, it passes through this function and is automaticaly escaped,
+ # blocking invalid nested overlap.
+ #
+ return $this->hashPart($text, 'C');
+ }
+
+
+ function doAnchors($text) {
+ #
+ # Turn Markdown link shortcuts into XHTML tags.
+ #
+ if ($this->in_anchor) return $text;
+ $this->in_anchor = true;
+
+ #
+ # First, handle reference-style links: [link text] [id]
+ #
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ \[
+ ('.$this->nested_brackets_re.') # link text = $2
+ \]
+
+ [ ]? # one optional space
+ (?:\n[ ]*)? # one optional newline followed by spaces
+
+ \[
+ (.*?) # id = $3
+ \]
+ )
+ }xs',
+ array(&$this, '_doAnchors_reference_callback'), $text);
+
+ #
+ # Next, inline-style links: [link text](url "optional title")
+ #
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ \[
+ ('.$this->nested_brackets_re.') # link text = $2
+ \]
+ \( # literal paren
+ [ \n]*
+ (?:
+ <(.+?)> # href = $3
+ |
+ ('.$this->nested_url_parenthesis_re.') # href = $4
+ )
+ [ \n]*
+ ( # $5
+ ([\'"]) # quote char = $6
+ (.*?) # Title = $7
+ \6 # matching quote
+ [ \n]* # ignore any spaces/tabs between closing quote and )
+ )? # title is optional
+ \)
+ (?:[ ]? '.$this->id_class_attr_catch_re.' )? # $8 = id/class attributes
+ )
+ }xs',
+ array(&$this, '_doAnchors_inline_callback'), $text);
+
+ #
+ # Last, handle reference-style shortcuts: [link text]
+ # These must come last in case you've also got [link text][1]
+ # or [link text](/foo)
+ #
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ \[
+ ([^\[\]]+) # link text = $2; can\'t contain [ or ]
+ \]
+ )
+ }xs',
+ array(&$this, '_doAnchors_reference_callback'), $text);
+
+ $this->in_anchor = false;
+ return $text;
+ }
+ function _doAnchors_reference_callback($matches) {
+ $whole_match = $matches[1];
+ $link_text = $matches[2];
+ $link_id =& $matches[3];
+
+ if ($link_id == "") {
+ # for shortcut links like [this][] or [this].
+ $link_id = $link_text;
+ }
+
+ # lower-case and turn embedded newlines into spaces
+ $link_id = strtolower($link_id);
+ $link_id = preg_replace('{[ ]?\n}', ' ', $link_id);
+
+ if (isset($this->urls[$link_id])) {
+ $url = $this->urls[$link_id];
+ $url = $this->encodeAttribute($url);
+
+ $result = "titles[$link_id] ) ) {
+ $title = $this->titles[$link_id];
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\"";
+ }
+ if (isset($this->ref_attr[$link_id]))
+ $result .= $this->ref_attr[$link_id];
+
+ $link_text = $this->runSpanGamut($link_text);
+ $result .= ">$link_text";
+ $result = $this->hashPart($result);
+ }
+ else {
+ $result = $whole_match;
+ }
+ return $result;
+ }
+ function _doAnchors_inline_callback($matches) {
+ $whole_match = $matches[1];
+ $link_text = $this->runSpanGamut($matches[2]);
+ $url = $matches[3] == '' ? $matches[4] : $matches[3];
+ $title =& $matches[7];
+ $attr = $this->doExtraAttributes("a", $dummy =& $matches[8]);
+
+
+ $url = $this->encodeAttribute($url);
+
+ $result = "encodeAttribute($title);
+ $result .= " title=\"$title\"";
+ }
+ $result .= $attr;
+
+ $link_text = $this->runSpanGamut($link_text);
+ $result .= ">$link_text";
+
+ return $this->hashPart($result);
+ }
+
+
+ function doImages($text) {
+ #
+ # Turn Markdown image shortcuts into tags.
+ #
+ #
+ # First, handle reference-style labeled images: ![alt text][id]
+ #
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ !\[
+ ('.$this->nested_brackets_re.') # alt text = $2
+ \]
+
+ [ ]? # one optional space
+ (?:\n[ ]*)? # one optional newline followed by spaces
+
+ \[
+ (.*?) # id = $3
+ \]
+
+ )
+ }xs',
+ array(&$this, '_doImages_reference_callback'), $text);
+
+ #
+ # Next, handle inline images: 
+ # Don't forget: encode * and _
+ #
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ !\[
+ ('.$this->nested_brackets_re.') # alt text = $2
+ \]
+ \s? # One optional whitespace character
+ \( # literal paren
+ [ \n]*
+ (?:
+ <(\S*)> # src url = $3
+ |
+ ('.$this->nested_url_parenthesis_re.') # src url = $4
+ )
+ [ \n]*
+ ( # $5
+ ([\'"]) # quote char = $6
+ (.*?) # title = $7
+ \6 # matching quote
+ [ \n]*
+ )? # title is optional
+ \)
+ (?:[ ]? '.$this->id_class_attr_catch_re.' )? # $8 = id/class attributes
+ )
+ }xs',
+ array(&$this, '_doImages_inline_callback'), $text);
+
+ return $text;
+ }
+ function _doImages_reference_callback($matches) {
+ $whole_match = $matches[1];
+ $alt_text = $matches[2];
+ $link_id = strtolower($matches[3]);
+
+ if ($link_id == "") {
+ $link_id = strtolower($alt_text); # for shortcut links like ![this][].
+ }
+
+ $alt_text = $this->encodeAttribute($alt_text);
+ if (isset($this->urls[$link_id])) {
+ $url = $this->encodeAttribute($this->urls[$link_id]);
+ $result = "titles[$link_id])) {
+ $title = $this->titles[$link_id];
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\"";
+ }
+ if (isset($this->ref_attr[$link_id]))
+ $result .= $this->ref_attr[$link_id];
+ $result .= $this->empty_element_suffix;
+ $result = $this->hashPart($result);
+ }
+ else {
+ # If there's no such link ID, leave intact:
+ $result = $whole_match;
+ }
+
+ return $result;
+ }
+ function _doImages_inline_callback($matches) {
+ $whole_match = $matches[1];
+ $alt_text = $matches[2];
+ $url = $matches[3] == '' ? $matches[4] : $matches[3];
+ $title =& $matches[7];
+ $attr = $this->doExtraAttributes("img", $dummy =& $matches[8]);
+
+ $alt_text = $this->encodeAttribute($alt_text);
+ $url = $this->encodeAttribute($url);
+ $result = "encodeAttribute($title);
+ $result .= " title=\"$title\""; # $title already quoted
+ }
+ $result .= $attr;
+ $result .= $this->empty_element_suffix;
+
+ return $this->hashPart($result);
+ }
+
+
+ function doHeaders($text) {
+ #
+ # Redefined to add id and class attribute support.
+ #
+ # Setext-style headers:
+ # Header 1 {#header1}
+ # ========
+ #
+ # Header 2 {#header2 .class1 .class2}
+ # --------
+ #
+ $text = preg_replace_callback(
+ '{
+ (^.+?) # $1: Header text
+ (?:[ ]+ '.$this->id_class_attr_catch_re.' )? # $3 = id/class attributes
+ [ ]*\n(=+|-+)[ ]*\n+ # $3: Header footer
+ }mx',
+ array(&$this, '_doHeaders_callback_setext'), $text);
+
+ # atx-style headers:
+ # # Header 1 {#header1}
+ # ## Header 2 {#header2}
+ # ## Header 2 with closing hashes ## {#header3.class1.class2}
+ # ...
+ # ###### Header 6 {.class2}
+ #
+ $text = preg_replace_callback('{
+ ^(\#{1,6}) # $1 = string of #\'s
+ [ ]*
+ (.+?) # $2 = Header text
+ [ ]*
+ \#* # optional closing #\'s (not counted)
+ (?:[ ]+ '.$this->id_class_attr_catch_re.' )? # $3 = id/class attributes
+ [ ]*
+ \n+
+ }xm',
+ array(&$this, '_doHeaders_callback_atx'), $text);
+
+ return $text;
+ }
+ function _doHeaders_callback_setext($matches) {
+ if ($matches[3] == '-' && preg_match('{^- }', $matches[1]))
+ return $matches[0];
+ $level = $matches[3][0] == '=' ? 1 : 2;
+ $attr = $this->doExtraAttributes("h$level", $dummy =& $matches[2]);
+ $block = "".$this->runSpanGamut($matches[1])."";
+ return "\n" . $this->hashBlock($block) . "\n\n";
+ }
+ function _doHeaders_callback_atx($matches) {
+ $level = strlen($matches[1]);
+ $attr = $this->doExtraAttributes("h$level", $dummy =& $matches[3]);
+ $block = "".$this->runSpanGamut($matches[2])."";
+ return "\n" . $this->hashBlock($block) . "\n\n";
+ }
+
+
+ function doTables($text) {
+ #
+ # Form HTML tables.
+ #
+ $less_than_tab = $this->tab_width - 1;
+ #
+ # Find tables with leading pipe.
+ #
+ # | Header 1 | Header 2
+ # | -------- | --------
+ # | Cell 1 | Cell 2
+ # | Cell 3 | Cell 4
+ #
+ $text = preg_replace_callback('
+ {
+ ^ # Start of a line
+ [ ]{0,'.$less_than_tab.'} # Allowed whitespace.
+ [|] # Optional leading pipe (present)
+ (.+) \n # $1: Header row (at least one pipe)
+
+ [ ]{0,'.$less_than_tab.'} # Allowed whitespace.
+ [|] ([ ]*[-:]+[-| :]*) \n # $2: Header underline
+
+ ( # $3: Cells
+ (?>
+ [ ]* # Allowed whitespace.
+ [|] .* \n # Row content.
+ )*
+ )
+ (?=\n|\Z) # Stop at final double newline.
+ }xm',
+ array(&$this, '_doTable_leadingPipe_callback'), $text);
+
+ #
+ # Find tables without leading pipe.
+ #
+ # Header 1 | Header 2
+ # -------- | --------
+ # Cell 1 | Cell 2
+ # Cell 3 | Cell 4
+ #
+ $text = preg_replace_callback('
+ {
+ ^ # Start of a line
+ [ ]{0,'.$less_than_tab.'} # Allowed whitespace.
+ (\S.*[|].*) \n # $1: Header row (at least one pipe)
+
+ [ ]{0,'.$less_than_tab.'} # Allowed whitespace.
+ ([-:]+[ ]*[|][-| :]*) \n # $2: Header underline
+
+ ( # $3: Cells
+ (?>
+ .* [|] .* \n # Row content
+ )*
+ )
+ (?=\n|\Z) # Stop at final double newline.
+ }xm',
+ array(&$this, '_DoTable_callback'), $text);
+
+ return $text;
+ }
+ function _doTable_leadingPipe_callback($matches) {
+ $head = $matches[1];
+ $underline = $matches[2];
+ $content = $matches[3];
+
+ # Remove leading pipe for each row.
+ $content = preg_replace('/^ *[|]/m', '', $content);
+
+ return $this->_doTable_callback(array($matches[0], $head, $underline, $content));
+ }
+ function _doTable_callback($matches) {
+ $head = $matches[1];
+ $underline = $matches[2];
+ $content = $matches[3];
+
+ # Remove any tailing pipes for each line.
+ $head = preg_replace('/[|] *$/m', '', $head);
+ $underline = preg_replace('/[|] *$/m', '', $underline);
+ $content = preg_replace('/[|] *$/m', '', $content);
+
+ # Reading alignement from header underline.
+ $separators = preg_split('/ *[|] */', $underline);
+ foreach ($separators as $n => $s) {
+ if (preg_match('/^ *-+: *$/', $s)) $attr[$n] = ' align="right"';
+ else if (preg_match('/^ *:-+: *$/', $s))$attr[$n] = ' align="center"';
+ else if (preg_match('/^ *:-+ *$/', $s)) $attr[$n] = ' align="left"';
+ else $attr[$n] = '';
+ }
+
+ # Parsing span elements, including code spans, character escapes,
+ # and inline HTML tags, so that pipes inside those gets ignored.
+ $head = $this->parseSpan($head);
+ $headers = preg_split('/ *[|] */', $head);
+ $col_count = count($headers);
+ $attr = array_pad($attr, $col_count, '');
+
+ # Write column headers.
+ $text = "
";
+
+ return $this->hashBlock($text) . "\n";
+ }
+
+
+ function doDefLists($text) {
+ #
+ # Form HTML definition lists.
+ #
+ $less_than_tab = $this->tab_width - 1;
+
+ # Re-usable pattern to match any entire dl list:
+ $whole_list_re = '(?>
+ ( # $1 = whole list
+ ( # $2
+ [ ]{0,'.$less_than_tab.'}
+ ((?>.*\S.*\n)+) # $3 = defined term
+ \n?
+ [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition
+ )
+ (?s:.+?)
+ ( # $4
+ \z
+ |
+ \n{2,}
+ (?=\S)
+ (?! # Negative lookahead for another term
+ [ ]{0,'.$less_than_tab.'}
+ (?: \S.*\n )+? # defined term
+ \n?
+ [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition
+ )
+ (?! # Negative lookahead for another definition
+ [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition
+ )
+ )
+ )
+ )'; // mx
+
+ $text = preg_replace_callback('{
+ (?>\A\n?|(?<=\n\n))
+ '.$whole_list_re.'
+ }mx',
+ array(&$this, '_doDefLists_callback'), $text);
+
+ return $text;
+ }
+ function _doDefLists_callback($matches) {
+ # Re-usable patterns to match list item bullets and number markers:
+ $list = $matches[1];
+
+ # Turn double returns into triple returns, so that we can make a
+ # paragraph for the last item in a list, if necessary:
+ $result = trim($this->processDefListItems($list));
+ $result = "
\n" . $result . "\n
";
+ return $this->hashBlock($result) . "\n\n";
+ }
+
+
+ function processDefListItems($list_str) {
+ #
+ # Process the contents of a single definition list, splitting it
+ # into individual term and definition list items.
+ #
+ $less_than_tab = $this->tab_width - 1;
+
+ # trim trailing blank lines:
+ $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str);
+
+ # Process definition terms.
+ $list_str = preg_replace_callback('{
+ (?>\A\n?|\n\n+) # leading line
+ ( # definition terms = $1
+ [ ]{0,'.$less_than_tab.'} # leading whitespace
+ (?!\:[ ]|[ ]) # negative lookahead for a definition
+ # mark (colon) or more whitespace.
+ (?> \S.* \n)+? # actual term (not whitespace).
+ )
+ (?=\n?[ ]{0,3}:[ ]) # lookahead for following line feed
+ # with a definition mark.
+ }xm',
+ array(&$this, '_processDefListItems_callback_dt'), $list_str);
+
+ # Process actual definitions.
+ $list_str = preg_replace_callback('{
+ \n(\n+)? # leading line = $1
+ ( # marker space = $2
+ [ ]{0,'.$less_than_tab.'} # whitespace before colon
+ \:[ ]+ # definition mark (colon)
+ )
+ ((?s:.+?)) # definition text = $3
+ (?= \n+ # stop at next definition mark,
+ (?: # next term or end of text
+ [ ]{0,'.$less_than_tab.'} \:[ ] |
+
";
+
+ return "\n\n".$this->hashBlock($codeblock)."\n\n";
+ }
+ function _doFencedCodeBlocks_newlines($matches) {
+ return str_repeat(" empty_element_suffix",
+ strlen($matches[0]));
+ }
+
+
+ #
+ # Redefining emphasis markers so that emphasis by underscore does not
+ # work in the middle of a word.
+ #
+ public $em_relist = array(
+ '' => '(?:(? '(?<=\S|^)(? '(?<=\S|^)(? '(?:(? '(?<=\S|^)(? '(?<=\S|^)(? '(?:(? '(?<=\S|^)(? '(?<=\S|^)(? tags
+ #
+ # Strip leading and trailing lines:
+ $text = preg_replace('/\A\n+|\n+\z/', '', $text);
+
+ $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY);
+
+ #
+ # Wrap
tags and unhashify HTML blocks
+ #
+ foreach ($grafs as $key => $value) {
+ $value = trim($this->runSpanGamut($value));
+
+ # Check if this should be enclosed in a paragraph.
+ # Clean tag hashes & block tag hashes are left alone.
+ $is_p = !preg_match('/^B\x1A[0-9]+B|^C\x1A[0-9]+C$/', $value);
+
+ if ($is_p) {
+ $value = "
$value
";
+ }
+ $grafs[$key] = $value;
+ }
+
+ # Join grafs in one text, then unhash HTML tags.
+ $text = implode("\n\n", $grafs);
+
+ # Finish by removing any tag hashes still present in $text.
+ $text = $this->unhash($text);
+
+ return $text;
+ }
+
+
+ ### Footnotes
+
+ function stripFootnotes($text) {
+ #
+ # Strips link definitions from text, stores the URLs and titles in
+ # hash references.
+ #
+ $less_than_tab = $this->tab_width - 1;
+
+ # Link defs are in the form: [^id]: url "optional title"
+ $text = preg_replace_callback('{
+ ^[ ]{0,'.$less_than_tab.'}\[\^(.+?)\][ ]?: # note_id = $1
+ [ ]*
+ \n? # maybe *one* newline
+ ( # text = $2 (no blank lines allowed)
+ (?:
+ .+ # actual text
+ |
+ \n # newlines but
+ (?!\[\^.+?\]:\s)# negative lookahead for footnote marker.
+ (?!\n+[ ]{0,3}\S)# ensure line is not blank and followed
+ # by non-indented content
+ )*
+ )
+ }xm',
+ array(&$this, '_stripFootnotes_callback'),
+ $text);
+ return $text;
+ }
+ function _stripFootnotes_callback($matches) {
+ $note_id = $this->fn_id_prefix . $matches[1];
+ $this->footnotes[$note_id] = $this->outdent($matches[2]);
+ return ''; # String that will replace the block
+ }
+
+
+ function doFootnotes($text) {
+ #
+ # Replace footnote references in $text [^id] with a special text-token
+ # which will be replaced by the actual footnote marker in appendFootnotes.
+ #
+ if (!$this->in_anchor) {
+ $text = preg_replace('{\[\^(.+?)\]}', "F\x1Afn:\\1\x1A:", $text);
+ }
+ return $text;
+ }
+
+
+ function appendFootnotes($text) {
+ #
+ # Append footnote list to text.
+ #
+ $text = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}',
+ array(&$this, '_appendFootnotes_callback'), $text);
+
+ if (!empty($this->footnotes_ordered)) {
+ $text .= "\n\n";
+ $text .= "
";
+ }
+ return $text;
+ }
+ function _appendFootnotes_callback($matches) {
+ $node_id = $this->fn_id_prefix . $matches[1];
+
+ # Create footnote marker only if it has a corresponding footnote *and*
+ # the footnote hasn't been used by another marker.
+ if (isset($this->footnotes[$node_id])) {
+ $num =& $this->footnotes_numbers[$node_id];
+ if (!isset($num)) {
+ # Transfer footnote content to the ordered list and give it its
+ # number
+ $this->footnotes_ordered[$node_id] = $this->footnotes[$node_id];
+ $this->footnotes_ref_count[$node_id] = 1;
+ $num = $this->footnote_counter++;
+ $ref_count_mark = '';
+ } else {
+ $ref_count_mark = $this->footnotes_ref_count[$node_id] += 1;
+ }
+
+ $attr = "";
+ if ($this->fn_link_class != "") {
+ $class = $this->fn_link_class;
+ $class = $this->encodeAttribute($class);
+ $attr .= " class=\"$class\"";
+ }
+ if ($this->fn_link_title != "") {
+ $title = $this->fn_link_title;
+ $title = $this->encodeAttribute($title);
+ $attr .= " title=\"$title\"";
+ }
+
+ $attr = str_replace("%%", $num, $attr);
+ $node_id = $this->encodeAttribute($node_id);
+
+ return
+ "".
+ "$num".
+ "";
+ }
+
+ return "[^".$matches[1]."]";
+ }
+
+
+ ### Abbreviations ###
+
+ function stripAbbreviations($text) {
+ #
+ # Strips abbreviations from text, stores titles in hash references.
+ #
+ $less_than_tab = $this->tab_width - 1;
+
+ # Link defs are in the form: [id]*: url "optional title"
+ $text = preg_replace_callback('{
+ ^[ ]{0,'.$less_than_tab.'}\*\[(.+?)\][ ]?: # abbr_id = $1
+ (.*) # text = $2 (no blank lines allowed)
+ }xm',
+ array(&$this, '_stripAbbreviations_callback'),
+ $text);
+ return $text;
+ }
+ function _stripAbbreviations_callback($matches) {
+ $abbr_word = $matches[1];
+ $abbr_desc = $matches[2];
+ if ($this->abbr_word_re)
+ $this->abbr_word_re .= '|';
+ $this->abbr_word_re .= preg_quote($abbr_word);
+ $this->abbr_desciptions[$abbr_word] = trim($abbr_desc);
+ return ''; # String that will replace the block
+ }
+
+
+ function doAbbreviations($text) {
+ #
+ # Find defined abbreviations in text and wrap them in elements.
+ #
+ if ($this->abbr_word_re) {
+ // cannot use the /x modifier because abbr_word_re may
+ // contain significant spaces:
+ $text = preg_replace_callback('{'.
+ '(?abbr_word_re.')'.
+ '(?![\w\x1A])'.
+ '}',
+ array(&$this, '_doAbbreviations_callback'), $text);
+ }
+ return $text;
+ }
+ function _doAbbreviations_callback($matches) {
+ $abbr = $matches[0];
+ if (isset($this->abbr_desciptions[$abbr])) {
+ $desc = $this->abbr_desciptions[$abbr];
+ if (empty($desc)) {
+ return $this->hashPart("$abbr");
+ } else {
+ $desc = $this->encodeAttribute($desc);
+ return $this->hashPart("$abbr");
+ }
+ } else {
+ return $matches[0];
+ }
+ }
+
+}
+
+
+/*
+
+PHP Markdown Extra
+==================
+
+Description
+-----------
+
+This is a PHP port of the original Markdown formatter written in Perl
+by John Gruber. This special "Extra" version of PHP Markdown features
+further enhancements to the syntax for making additional constructs
+such as tables and definition list.
+
+Markdown is a text-to-HTML filter; it translates an easy-to-read /
+easy-to-write structured text format into HTML. Markdown's text format
+is mostly similar to that of plain text email, and supports features such
+as headers, *emphasis*, code blocks, blockquotes, and links.
+
+Markdown's syntax is designed not as a generic markup language, but
+specifically to serve as a front-end to (X)HTML. You can use span-level
+HTML tags anywhere in a Markdown document, and you can use block level
+HTML tags (like
and
as well).
+
+For more information about Markdown's syntax, see:
+
+
+
+
+Bugs
+----
+
+To file bug reports please send email to:
+
+
+
+Please include with your report: (1) the example input; (2) the output you
+expected; (3) the output Markdown actually produced.
+
+
+Version History
+---------------
+
+See the readme file for detailed release notes for this version.
+
+
+Copyright and License
+---------------------
+
+PHP Markdown & Extra
+Copyright (c) 2004-2013 Michel Fortin
+
+All rights reserved.
+
+Based on Markdown
+Copyright (c) 2003-2006 John Gruber
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name "Markdown" nor the names of its contributors may
+ be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+This software is provided by the copyright holders and contributors "as
+is" and any express or implied warranties, including, but not limited
+to, the implied warranties of merchantability and fitness for a
+particular purpose are disclaimed. In no event shall the copyright owner
+or contributors be liable for any direct, indirect, incidental, special,
+exemplary, or consequential damages (including, but not limited to,
+procurement of substitute goods or services; loss of use, data, or
+profits; or business interruption) however caused and on any theory of
+liability, whether in contract, strict liability, or tort (including
+negligence or otherwise) arising in any way out of the use of this
+software, even if advised of the possibility of such damage.
+
+*/
+?>
diff --git a/wp-content/plugins/jetpack/_inc/lib/markdown/gfm.php b/wp-content/plugins/jetpack/_inc/lib/markdown/gfm.php
new file mode 100644
index 000000000..c382b4279
--- /dev/null
+++ b/wp-content/plugins/jetpack/_inc/lib/markdown/gfm.php
@@ -0,0 +1,400 @@
+
+ * @link https://github.com/evansolomon/wp-github-flavored-markdown-comments
+ *
+ * Add a few extras from GitHub's Markdown implementation. Must be used in a WordPress environment.
+ */
+
+class WPCom_GHF_Markdown_Parser extends MarkdownExtra_Parser {
+
+ /**
+ * Hooray somewhat arbitrary numbers that are fearful of 1.0.x.
+ */
+ const WPCOM_GHF_MARDOWN_VERSION = '0.9.0';
+
+ /**
+ * Use a [code] shortcode when encountering a fenced code block
+ * @var boolean
+ */
+ public $use_code_shortcode = true;
+
+ /**
+ * Preserve shortcodes, untouched by Markdown.
+ * This requires use within a WordPress installation.
+ * @var boolean
+ */
+ public $preserve_shortcodes = true;
+
+ /**
+ * Preserve the legacy $latex your-latex-code-here$ style
+ * LaTeX markup
+ */
+ public $preserve_latex = true;
+
+ /**
+ * Preserve single-line blocks.
+ * @var boolean
+ */
+ public $preserve_inline_code_blocks = true;
+
+ /**
+ * Strip paragraphs from the output. This is the right default for WordPress,
+ * which generally wants to create its own paragraphs with `wpautop`
+ * @var boolean
+ */
+ public $strip_paras = true;
+
+ // Will run through sprintf - you can supply your own syntax if you want
+ public $shortcode_start = '[code lang=%s]';
+ public $shortcode_end = '[/code]';
+
+ // Stores shortcodes we remove and then replace
+ protected $preserve_text_hash = array();
+
+ /**
+ * Set environment defaults based on presence of key functions/classes.
+ */
+ public function __construct() {
+ $this->use_code_shortcode = class_exists( 'SyntaxHighlighter' );
+ /**
+ * Allow processing shortcode contents.
+ *
+ * @module markdown
+ *
+ * @since 4.4.0
+ *
+ * @param boolean $preserve_shortcodes Defaults to $this->preserve_shortcodes.
+ */
+ $this->preserve_shortcodes = apply_filters( 'jetpack_markdown_preserve_shortcodes', $this->preserve_shortcodes ) && function_exists( 'get_shortcode_regex' );
+ $this->preserve_latex = function_exists( 'latex_markup' );
+ $this->strip_paras = function_exists( 'wpautop' );
+
+ parent::__construct();
+ }
+
+ /**
+ * Overload to specify heading styles only if the hash has space(s) after it. This is actually in keeping with
+ * the documentation and eases the semantic overload of the hash character.
+ * #Will Not Produce a Heading 1
+ * # This Will Produce a Heading 1
+ *
+ * @param string $text Markdown text
+ * @return string HTML-transformed text
+ */
+ public function transform( $text ) {
+ // Preserve anything inside a single-line element
+ if ( $this->preserve_inline_code_blocks ) {
+ $text = $this->single_line_code_preserve( $text );
+ }
+ // Remove all shortcodes so their interiors are left intact
+ if ( $this->preserve_shortcodes ) {
+ $text = $this->shortcode_preserve( $text );
+ }
+ // Remove legacy LaTeX so it's left intact
+ if ( $this->preserve_latex ) {
+ $text = $this->latex_preserve( $text );
+ }
+
+ // escape line-beginning # chars that do not have a space after them.
+ $text = preg_replace_callback( '|^#{1,6}( )?|um', array( $this, '_doEscapeForHashWithoutSpacing' ), $text );
+
+ /**
+ * Allow third-party plugins to define custom patterns that won't be processed by Markdown.
+ *
+ * @module markdown
+ *
+ * @since 3.9.2
+ *
+ * @param array $custom_patterns Array of custom patterns to be ignored by Markdown.
+ */
+ $custom_patterns = apply_filters( 'jetpack_markdown_preserve_pattern', array() );
+ if ( is_array( $custom_patterns ) && ! empty( $custom_patterns ) ) {
+ foreach ( $custom_patterns as $pattern ) {
+ $text = preg_replace_callback( $pattern, array( $this, '_doRemoveText'), $text );
+ }
+ }
+
+ // run through core Markdown
+ $text = parent::transform( $text );
+
+ // Occasionally Markdown Extra chokes on a para structure, producing odd paragraphs.
+ $text = str_replace( "
<
\n\n
p>", '
', $text );
+
+ // put start-of-line # chars back in place
+ $text = $this->restore_leading_hash( $text );
+
+ // Strip paras if set
+ if ( $this->strip_paras ) {
+ $text = $this->unp( $text );
+ }
+
+ // Restore preserved things like shortcodes/LaTeX
+ $text = $this->do_restore( $text );
+
+ return $text;
+ }
+
+ /**
+ * Prevents blocks like __this__ from turning into this
+ * @param string $text Text that may need preserving
+ * @return string Text that was preserved if needed
+ */
+ public function single_line_code_preserve( $text ) {
+ return preg_replace_callback( '|]*>(.*?)|', array( $this, 'do_single_line_code_preserve' ), $text );
+ }
+
+ /**
+ * Regex callback for inline code presevation
+ * @param array $matches Regex matches
+ * @return string Hashed content for later restoration
+ */
+ public function do_single_line_code_preserve( $matches ) {
+ return '' . $this->hash_block( $matches[1] ) . '';
+ }
+
+ /**
+ * Preserve code block contents by HTML encoding them. Useful before getting to KSES stripping.
+ * @param string $text Markdown/HTML content
+ * @return string Markdown/HTML content with escaped code blocks
+ */
+ public function codeblock_preserve( $text ) {
+ return preg_replace_callback( "/^([`~]{3})([^`\n]+)?\n([^`~]+)(\\1)/m", array( $this, 'do_codeblock_preserve' ), $text );
+ }
+
+ /**
+ * Regex callback for code block preservation.
+ * @param array $matches Regex matches
+ * @return string Codeblock with escaped interior
+ */
+ public function do_codeblock_preserve( $matches ) {
+ $block = stripslashes( $matches[3] );
+ $block = esc_html( $block );
+ $block = str_replace( '\\', '\\\\', $block );
+ $open = $matches[1] . $matches[2] . "\n";
+ return $open . $block . $matches[4];
+ }
+
+ /**
+ * Restore previously preserved (i.e. escaped) code block contents.
+ * @param string $text Markdown/HTML content with escaped code blocks
+ * @return string Markdown/HTML content
+ */
+ public function codeblock_restore( $text ) {
+ return preg_replace_callback( "/^([`~]{3})([^`\n]+)?\n([^`~]+)(\\1)/m", array( $this, 'do_codeblock_restore' ), $text );
+ }
+
+ /**
+ * Regex callback for code block restoration (unescaping).
+ * @param array $matches Regex matches
+ * @return string Codeblock with unescaped interior
+ */
+ public function do_codeblock_restore( $matches ) {
+ $block = html_entity_decode( $matches[3], ENT_QUOTES );
+ $open = $matches[1] . $matches[2] . "\n";
+ return $open . $block . $matches[4];
+ }
+
+ /**
+ * Called to preserve legacy LaTeX like $latex some-latex-text $
+ * @param string $text Text in which to preserve LaTeX
+ * @return string Text with LaTeX replaced by a hash that will be restored later
+ */
+ protected function latex_preserve( $text ) {
+ // regex from latex_remove()
+ $regex = '%
+ \$latex(?:=\s*|\s+)
+ ((?:
+ [^$]+ # Not a dollar
+ |
+ (?<=(?get_shortcode_regex(), array( $this, '_doRemoveText' ), $text );
+ return $text;
+ }
+
+ /**
+ * Restores any text preserved by $this->hash_block()
+ * @param string $text Text that may have hashed preservation placeholders
+ * @return string Text with hashed preseravtion placeholders replaced by original text
+ */
+ protected function do_restore( $text ) {
+ // Reverse hashes to ensure nested blocks are restored.
+ $hashes = array_reverse( $this->preserve_text_hash, true );
+ foreach( $hashes as $hash => $value ) {
+ $placeholder = $this->hash_maker( $hash );
+ $text = str_replace( $placeholder, $value, $text );
+ }
+ // reset the hash
+ $this->preserve_text_hash = array();
+ return $text;
+ }
+
+ /**
+ * Regex callback for text preservation
+ * @param array $m Regex $matches array
+ * @return string A placeholder that will later be replaced by the original text
+ */
+ protected function _doRemoveText( $m ) {
+ return $this->hash_block( $m[0] );
+ }
+
+ /**
+ * Call this to store a text block for later restoration.
+ * @param string $text Text to preserve for later
+ * @return string Placeholder that will be swapped out later for the original text
+ */
+ protected function hash_block( $text ) {
+ $hash = md5( $text );
+ $this->preserve_text_hash[ $hash ] = $text;
+ $placeholder = $this->hash_maker( $hash );
+ return $placeholder;
+ }
+
+ /**
+ * Less glamorous than the Keymaker
+ * @param string $hash An md5 hash
+ * @return string A placeholder hash
+ */
+ protected function hash_maker( $hash ) {
+ return 'MARKDOWN_HASH' . $hash . 'MARKDOWN_HASH';
+ }
+
+ /**
+ * Remove bare
elements.
s with attributes will be preserved.
+ * @param string $text HTML content
+ * @return string
-less content
+ */
+ public function unp( $text ) {
+ return preg_replace( "#
(.*?)
(\n|$)#ums", '$1$2', $text );
+ }
+
+ /**
+ * A regex of all shortcodes currently registered by the current
+ * WordPress installation
+ * @uses get_shortcode_regex()
+ * @return string A regex for grabbing shortcodes.
+ */
+ protected function get_shortcode_regex() {
+ $pattern = get_shortcode_regex();
+
+ // don't match markdown link anchors that could be mistaken for shortcodes.
+ $pattern .= '(?!\()';
+
+ return "/$pattern/s";
+ }
+
+ /**
+ * Since we escape unspaced #Headings, put things back later.
+ * @param string $text text with a leading escaped hash
+ * @return string text with leading hashes unescaped
+ */
+ protected function restore_leading_hash( $text ) {
+ return preg_replace( "/^(
)?(#|\\\\#)/um", "$1#", $text );
+ }
+
+ /**
+ * Overload to support ```-fenced code blocks for pre-Markdown Extra 1.2.8
+ * https://help.github.com/articles/github-flavored-markdown#fenced-code-blocks
+ */
+ public function doFencedCodeBlocks( $text ) {
+ // If we're at least at 1.2.8, native fenced code blocks are in.
+ // Below is just copied from it in case we somehow got loaded on
+ // top of someone else's Markdown Extra
+ if ( version_compare( MARKDOWNEXTRA_VERSION, '1.2.8', '>=' ) )
+ return parent::doFencedCodeBlocks( $text );
+
+ #
+ # Adding the fenced code block syntax to regular Markdown:
+ #
+ # ~~~
+ # Code block
+ # ~~~
+ #
+ $less_than_tab = $this->tab_width;
+
+ $text = preg_replace_callback('{
+ (?:\n|\A)
+ # 1: Opening marker
+ (
+ (?:~{3,}|`{3,}) # 3 or more tildes/backticks.
+ )
+ [ ]*
+ (?:
+ \.?([-_:a-zA-Z0-9]+) # 2: standalone class name
+ |
+ '.$this->id_class_attr_catch_re.' # 3: Extra attributes
+ )?
+ [ ]* \n # Whitespace and newline following marker.
+
+ # 4: Content
+ (
+ (?>
+ (?!\1 [ ]* \n) # Not a closing marker.
+ .*\n+
+ )+
+ )
+
+ # Closing marker.
+ \1 [ ]* (?= \n )
+ }xm',
+ array($this, '_doFencedCodeBlocks_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Callback for pre-processing start of line hashes to slyly escape headings that don't
+ * have a leading space
+ * @param array $m preg_match matches
+ * @return string possibly escaped start of line hash
+ */
+ public function _doEscapeForHashWithoutSpacing( $m ) {
+ if ( ! isset( $m[1] ) )
+ $m[0] = '\\' . $m[0];
+ return $m[0];
+ }
+
+ /**
+ * Overload to support Viper's [code] shortcode. Because awesome.
+ */
+ public function _doFencedCodeBlocks_callback( $matches ) {
+ // in case we have some escaped leading hashes right at the start of the block
+ $matches[4] = $this->restore_leading_hash( $matches[4] );
+ // just MarkdownExtra_Parser if we're not going ultra-deluxe
+ if ( ! $this->use_code_shortcode ) {
+ return parent::_doFencedCodeBlocks_callback( $matches );
+ }
+
+ // default to a "text" class if one wasn't passed. Helps with encoding issues later.
+ if ( empty( $matches[2] ) ) {
+ $matches[2] = 'text';
+ }
+
+ $classname =& $matches[2];
+ $codeblock = preg_replace_callback('/^\n+/', array( $this, '_doFencedCodeBlocks_newlines' ), $matches[4] );
+
+ if ( $classname[0] == '.' )
+ $classname = substr( $classname, 1 );
+
+ $codeblock = esc_html( $codeblock );
+ $codeblock = sprintf( $this->shortcode_start, $classname ) . "\n{$codeblock}" . $this->shortcode_end;
+ return "\n\n" . $this->hashBlock( $codeblock ). "\n\n";
+ }
+
+}
diff --git a/wp-content/plugins/jetpack/_inc/lib/plans.php b/wp-content/plugins/jetpack/_inc/lib/plans.php
new file mode 100644
index 000000000..1fa3503e4
--- /dev/null
+++ b/wp-content/plugins/jetpack/_inc/lib/plans.php
@@ -0,0 +1,75 @@
+ 'GET',
+ 'headers' => array(
+ 'X-Forwarded-For' => Jetpack::current_user_ip( true ),
+ ),
+ ),
+ null,
+ 'rest'
+ );
+
+ $body = wp_remote_retrieve_body( $request );
+ if ( 200 === wp_remote_retrieve_response_code( $request ) ) {
+ return json_decode( $body );
+ } else {
+ return $body;
+ }
+ }
+
+ /**
+ * Get plan information for a plan given its slug
+ *
+ * @since 7.7.0
+ *
+ * @param string $plan_slug Plan slug.
+ *
+ * @return object The plan object
+ */
+ public static function get_plan( $plan_slug ) {
+ $plans = self::get_plans();
+ if ( ! is_array( $plans ) ) {
+ return;
+ }
+
+ foreach ( $plans as $plan ) {
+ if ( $plan_slug === $plan->product_slug ) {
+ return $plan;
+ }
+ }
+ }
+}
diff --git a/wp-content/plugins/jetpack/_inc/lib/plugins.php b/wp-content/plugins/jetpack/_inc/lib/plugins.php
new file mode 100644
index 000000000..9c8e3bc4d
--- /dev/null
+++ b/wp-content/plugins/jetpack/_inc/lib/plugins.php
@@ -0,0 +1,132 @@
+install( $zip_url );
+
+ if ( is_wp_error( $result ) ) {
+ return $result;
+ }
+
+ $plugin = Jetpack_Plugins::get_plugin_id_by_slug( $slug );
+ $error_code = 'install_error';
+ if ( ! $plugin ) {
+ $error = __( 'There was an error installing your plugin', 'jetpack' );
+ }
+
+ if ( ! $result ) {
+ $error_code = $upgrader->skin->get_main_error_code();
+ $message = $upgrader->skin->get_main_error_message();
+ $error = $message ? $message : __( 'An unknown error occurred during installation', 'jetpack' );
+ }
+
+ if ( ! empty( $error ) ) {
+ if ( 'download_failed' === $error_code ) {
+ // For backwards compatibility: versions prior to 3.9 would return no_package instead of download_failed.
+ $error_code = 'no_package';
+ }
+
+ return new WP_Error( $error_code, $error, 400 );
+ }
+
+ return (array) $upgrader->skin->get_upgrade_messages();
+ }
+
+ protected static function generate_wordpress_org_plugin_download_link( $plugin_slug ) {
+ return "https://downloads.wordpress.org/plugin/$plugin_slug.latest-stable.zip";
+ }
+
+ public static function get_plugin_id_by_slug( $slug ) {
+ // Check if get_plugins() function exists. This is required on the front end of the
+ // site, since it is in a file that is normally only loaded in the admin.
+ if ( ! function_exists( 'get_plugins' ) ) {
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
+ }
+
+ /** This filter is documented in wp-admin/includes/class-wp-plugins-list-table.php */
+ $plugins = apply_filters( 'all_plugins', get_plugins() );
+ if ( ! is_array( $plugins ) ) {
+ return false;
+ }
+ foreach ( $plugins as $plugin_file => $plugin_data ) {
+ if ( self::get_slug_from_file_path( $plugin_file ) === $slug ) {
+ return $plugin_file;
+ }
+ }
+
+ return false;
+ }
+
+ protected static function get_slug_from_file_path( $plugin_file ) {
+ // Similar to get_plugin_slug() method.
+ $slug = dirname( $plugin_file );
+ if ( '.' === $slug ) {
+ $slug = preg_replace( "/(.+)\.php$/", "$1", $plugin_file );
+ }
+
+ return $slug;
+ }
+}
diff --git a/wp-content/plugins/jetpack/_inc/lib/tonesque.php b/wp-content/plugins/jetpack/_inc/lib/tonesque.php
new file mode 100644
index 000000000..0e148e5c2
--- /dev/null
+++ b/wp-content/plugins/jetpack/_inc/lib/tonesque.php
@@ -0,0 +1,237 @@
+image_url = esc_url_raw( $image_url );
+ $this->image_url = trim( $this->image_url );
+ /**
+ * Allows any image URL to be passed in for $this->image_url.
+ *
+ * @module theme-tools
+ *
+ * @since 2.5.0
+ *
+ * @param string $image_url The URL to any image
+ */
+ $this->image_url = apply_filters( 'tonesque_image_url', $this->image_url );
+
+ $this->image_obj = self::imagecreatefromurl( $this->image_url );
+ }
+
+ public static function imagecreatefromurl( $image_url ) {
+ $data = null;
+
+ // If it's a URL:
+ if ( preg_match( '#^https?://#i', $image_url ) ) {
+ // If it's a url pointing to a local media library url:
+ $content_url = content_url();
+ $_image_url = set_url_scheme( $image_url );
+ if ( wp_startswith( $_image_url, $content_url ) ) {
+ $_image_path = str_replace( $content_url, WP_CONTENT_DIR, $_image_url );
+ if ( file_exists( $_image_path ) ) {
+ $filetype = wp_check_filetype( $_image_path );
+ $ext = $filetype['ext'];
+ $type = $filetype['type'];
+
+ if ( wp_startswith( $type, 'image/' ) ) {
+ $data = file_get_contents( $_image_path );
+ }
+ }
+ }
+
+ if ( empty( $data ) ) {
+ $response = wp_remote_get( $image_url );
+ if ( is_wp_error( $response ) ) {
+ return false;
+ }
+ $data = wp_remote_retrieve_body( $response );
+ }
+ }
+
+ // If it's a local path in our WordPress install:
+ if ( file_exists( $image_url ) ) {
+ $filetype = wp_check_filetype( $image_url );
+ $ext = $filetype['ext'];
+ $type = $filetype['type'];
+
+ if ( wp_startswith( $type, 'image/' ) ) {
+ $data = file_get_contents( $image_url );
+ }
+ }
+
+ // Now turn it into an image and return it.
+ return imagecreatefromstring( $data );
+ }
+
+ /**
+ *
+ * Construct object from image.
+ *
+ * @param optional $type (hex, rgb, hsv)
+ * @return color as a string formatted as $type
+ *
+ */
+ function color( $type = 'hex' ) {
+ // Bail if there is no image to work with
+ if ( ! $this->image_obj )
+ return false;
+
+ // Finds dominant color
+ $color = self::grab_color();
+ // Passes value to Color class
+ $color = self::get_color( $color, $type );
+ return $color;
+ }
+
+ /**
+ *
+ * Grabs the color index for each of five sample points of the image
+ *
+ * @param $image
+ * @param $type can be 'index' or 'hex'
+ * @return array() with color indices
+ *
+ */
+ function grab_points( $type = 'index' ) {
+ $img = $this->image_obj;
+ if ( ! $img )
+ return false;
+
+ $height = imagesy( $img );
+ $width = imagesx( $img );
+
+ // Sample five points in the image
+ // Based on rule of thirds and center
+ $topy = round( $height / 3 );
+ $bottomy = round( ( $height / 3 ) * 2 );
+ $leftx = round( $width / 3 );
+ $rightx = round( ( $width / 3 ) * 2 );
+ $centery = round( $height / 2 );
+ $centerx = round( $width / 2 );
+
+ // Cast those colors into an array
+ $points = array(
+ imagecolorat( $img, $leftx, $topy ),
+ imagecolorat( $img, $rightx, $topy ),
+ imagecolorat( $img, $leftx, $bottomy ),
+ imagecolorat( $img, $rightx, $bottomy ),
+ imagecolorat( $img, $centerx, $centery ),
+ );
+
+ if ( 'hex' == $type ) {
+ foreach ( $points as $i => $p ) {
+ $c = imagecolorsforindex( $img, $p );
+ $points[ $i ] = self::get_color( array(
+ 'r' => $c['red'],
+ 'g' => $c['green'],
+ 'b' => $c['blue'],
+ ), 'hex' );
+ }
+ }
+
+ return $points;
+ }
+
+ /**
+ *
+ * Finds the average color of the image based on five sample points
+ *
+ * @param $image
+ * @return array() with rgb color
+ *
+ */
+ function grab_color() {
+ $img = $this->image_obj;
+ if ( ! $img )
+ return false;
+
+ $rgb = self::grab_points();
+
+ // Process the color points
+ // Find the average representation
+ foreach ( $rgb as $color ) {
+ $index = imagecolorsforindex( $img, $color );
+ $r[] = $index['red'];
+ $g[] = $index['green'];
+ $b[] = $index['blue'];
+
+ $red = round( array_sum( $r ) / 5 );
+ $green = round( array_sum( $g ) / 5 );
+ $blue = round( array_sum( $b ) / 5 );
+ }
+
+ // The average color of the image as rgb array
+ $color = array(
+ 'r' => $red,
+ 'g' => $green,
+ 'b' => $blue,
+ );
+
+ return $color;
+ }
+
+ /**
+ *
+ * Get a Color object using /lib class.color
+ * Convert to appropriate type
+ *
+ * @return string
+ *
+ */
+ function get_color( $color, $type ) {
+ $c = new Jetpack_Color( $color, 'rgb' );
+ $this->color = $c;
+
+ switch ( $type ) {
+ case 'rgb' :
+ $color = implode( ',', $c->toRgbInt() );
+ break;
+ case 'hex' :
+ $color = $c->toHex();
+ break;
+ case 'hsv' :
+ $color = implode( ',', $c->toHsvInt() );
+ break;
+ default:
+ return $color = $c->toHex();
+ }
+
+ return $color;
+ }
+
+ /**
+ *
+ * Checks contrast against main color
+ * Gives either black or white for using with opacity
+ *
+ * @return string
+ *
+ */
+ function contrast() {
+ if ( ! $this->color )
+ return false;
+
+ $c = $this->color->getMaxContrastColor();
+ return implode( ',', $c->toRgbInt() );
+ }
+
+};
diff --git a/wp-content/plugins/jetpack/_inc/lib/tracks/tracks-ajax.js b/wp-content/plugins/jetpack/_inc/lib/tracks/tracks-ajax.js
new file mode 100644
index 000000000..98a9aaac7
--- /dev/null
+++ b/wp-content/plugins/jetpack/_inc/lib/tracks/tracks-ajax.js
@@ -0,0 +1,62 @@
+/* global jpTracksAJAX, jQuery */
+( function( $, jpTracksAJAX ) {
+ window.jpTracksAJAX = window.jpTracksAJAX || {};
+ var debugSet = localStorage.getItem( 'debug' ) === 'dops:analytics';
+
+ window.jpTracksAJAX.record_ajax_event = function( eventName, eventType, eventProp ) {
+ var data = {
+ tracksNonce: jpTracksAJAX.jpTracksAJAX_nonce,
+ action: 'jetpack_tracks',
+ tracksEventType: eventType,
+ tracksEventName: eventName,
+ tracksEventProp: eventProp || false,
+ };
+
+ return $.ajax( {
+ type: 'POST',
+ url: jpTracksAJAX.ajaxurl,
+ data: data,
+ success: function( response ) {
+ if ( debugSet ) {
+ // eslint-disable-next-line
+ console.log( 'AJAX tracks event recorded: ', data, response );
+ }
+ },
+ } );
+ };
+
+ $( document ).ready( function() {
+ $( 'body' ).on( 'click', '.jptracks a, a.jptracks', function( event ) {
+ var $this = $( event.target );
+ // We know that the jptracks element is either this, or its ancestor
+ var $jptracks = $this.closest( '.jptracks' );
+ // We need an event name at least
+ var eventName = $jptracks.attr( 'data-jptracks-name' );
+ if ( undefined === eventName ) {
+ return;
+ }
+
+ var eventProp = $jptracks.attr( 'data-jptracks-prop' ) || false;
+
+ var url = $this.attr( 'href' );
+ var target = $this.get( 0 ).target;
+ if ( url && target && '_self' !== target ) {
+ var newTabWindow = window.open( '', target );
+ newTabWindow.opener = null;
+ }
+
+ event.preventDefault();
+
+ window.jpTracksAJAX.record_ajax_event( eventName, 'click', eventProp ).always( function() {
+ // Continue on to whatever url they were trying to get to.
+ if ( url && ! $this.hasClass( 'thickbox' ) ) {
+ if ( newTabWindow ) {
+ newTabWindow.location = url;
+ return;
+ }
+ window.location = url;
+ }
+ } );
+ } );
+ } );
+} )( jQuery, jpTracksAJAX );
diff --git a/wp-content/plugins/jetpack/_inc/lib/tracks/tracks-callables.js b/wp-content/plugins/jetpack/_inc/lib/tracks/tracks-callables.js
new file mode 100644
index 000000000..4e033d2c7
--- /dev/null
+++ b/wp-content/plugins/jetpack/_inc/lib/tracks/tracks-callables.js
@@ -0,0 +1,79 @@
+/**
+ * This was abstracted from wp-calypso's analytics lib: https://github.com/Automattic/wp-calypso/blob/master/client/lib/analytics/README.md
+ * Some stuff was removed like GA tracking and other things not necessary for Jetpack tracking.
+ *
+ * This library should only be used and loaded if the Jetpack site is connected.
+ */
+
+// Load tracking scripts
+window._tkq = window._tkq || [];
+
+var _user;
+var debug = console.error; // eslint-disable-line no-console
+
+function buildQuerystring( group, name ) {
+ var uriComponent = '';
+
+ if ( 'object' === typeof group ) {
+ for ( var key in group ) {
+ uriComponent += '&x_' + encodeURIComponent( key ) + '=' + encodeURIComponent( group[ key ] );
+ }
+ } else {
+ uriComponent = '&x_' + encodeURIComponent( group ) + '=' + encodeURIComponent( name );
+ }
+
+ return uriComponent;
+}
+
+var analytics = {
+ initialize: function( userId, username ) {
+ analytics.setUser( userId, username );
+ analytics.identifyUser();
+ },
+
+ mc: {
+ bumpStat: function( group, name ) {
+ var uriComponent = buildQuerystring( group, name ); // prints debug info
+ new Image().src =
+ document.location.protocol +
+ '//pixel.wp.com/g.gif?v=wpcom-no-pv' +
+ uriComponent +
+ '&t=' +
+ Math.random();
+ },
+ },
+
+ tracks: {
+ recordEvent: function( eventName, eventProperties ) {
+ eventProperties = eventProperties || {};
+
+ if ( eventName.indexOf( 'jetpack_' ) !== 0 ) {
+ debug( '- Event name must be prefixed by "jetpack_"' );
+ return;
+ }
+
+ window._tkq.push( [ 'recordEvent', eventName, eventProperties ] );
+ },
+
+ recordPageView: function( urlPath ) {
+ analytics.tracks.recordEvent( 'jetpack_page_view', {
+ path: urlPath,
+ } );
+ },
+ },
+
+ setUser: function( userId, username ) {
+ _user = { ID: userId, username: username };
+ },
+
+ identifyUser: function() {
+ // Don't identify the user if we don't have one
+ if ( _user ) {
+ window._tkq.push( [ 'identifyUser', _user.ID, _user.username ] );
+ }
+ },
+
+ clearedIdentity: function() {
+ window._tkq.push( [ 'clearIdentity' ] );
+ },
+};
diff --git a/wp-content/plugins/jetpack/_inc/lib/widgets.php b/wp-content/plugins/jetpack/_inc/lib/widgets.php
new file mode 100644
index 000000000..8bdd7b76f
--- /dev/null
+++ b/wp-content/plugins/jetpack/_inc/lib/widgets.php
@@ -0,0 +1,780 @@
+ 'text-3',
+ * 'sidebar' => 'sidebar-1',
+ * 'position' => '0',
+ * 'settings' => array(
+ * 'title' => 'hello world'
+ * )
+ * )
+ *
+ *
+ * @param string|integer $position The position of the widget in its sidebar.
+ * @param string $widget_id The widget's id (eg: 'text-3').
+ * @param string $sidebar The widget's sidebar id (eg: 'sidebar-1').
+ * @param array (Optional) $settings The settings for the widget.
+ *
+ * @return array A normalized array representing this widget.
+ */
+ public static function format_widget( $position, $widget_id, $sidebar, $settings = null ) {
+ if ( ! $settings ) {
+ $all_settings = get_option( self::get_widget_option_name( $widget_id ) );
+ $instance = self::get_widget_instance_key( $widget_id );
+ $settings = $all_settings[$instance];
+ }
+ $widget = array();
+
+ $widget['id'] = $widget_id;
+ $widget['id_base'] = self::get_widget_id_base( $widget_id );
+ $widget['settings'] = $settings;
+ $widget['sidebar'] = $sidebar;
+ $widget['position'] = $position;
+
+ return $widget;
+ }
+
+ /**
+ * Return a widget's id_base from its id.
+ *
+ * @param string $widget_id The id of a widget. (eg: 'text-3')
+ *
+ * @return string The id_base of a widget (eg: 'text').
+ */
+ public static function get_widget_id_base( $widget_id ) {
+ // Grab what's before the hyphen.
+ return substr( $widget_id, 0, strrpos( $widget_id, '-' ) );
+ }
+
+ /**
+ * Determine a widget's option name (the WP option where the widget's settings
+ * are stored - generally `widget_` + the widget's id_base).
+ *
+ * @param string $widget_id The id of a widget. (eg: 'text-3')
+ *
+ * @return string The option name of the widget's settings. (eg: 'widget_text')
+ */
+ public static function get_widget_option_name( $widget_id ) {
+ return 'widget_' . self::get_widget_id_base( $widget_id );
+ }
+
+ /**
+ * Determine a widget instance key from its ID. (eg: 'text-3' becomes '3').
+ * Used to access the widget's settings.
+ *
+ * @param string $widget_id The id of a widget.
+ *
+ * @return integer The instance key of that widget.
+ */
+ public static function get_widget_instance_key( $widget_id ) {
+ // Grab all numbers from the end of the id.
+ preg_match('/(\d+)$/', $widget_id, $matches );
+
+ return intval( $matches[0] );
+ }
+
+ /**
+ * Return a widget by ID (formatted for output) or null if nothing is found.
+ *
+ * @param string $widget_id The id of a widget to look for.
+ *
+ * @return array|null The matching formatted widget (see format_widget).
+ */
+ public static function get_widget_by_id( $widget_id ) {
+ $found = null;
+ foreach ( self::get_all_widgets() as $widget ) {
+ if ( $widget['id'] === $widget_id ) {
+ $found = $widget;
+ }
+ }
+ return $found;
+ }
+
+ /**
+ * Return an array of all widgets (active and inactive) formatted for output.
+ *
+ * @return array An array of all widgets (see format_widget).
+ */
+ public static function get_all_widgets() {
+ $all_widgets = array();
+ $sidebars_widgets = self::get_all_sidebars();
+
+ foreach ( $sidebars_widgets as $sidebar => $widgets ) {
+ if ( ! is_array( $widgets ) ) {
+ continue;
+ }
+ foreach ( $widgets as $key => $widget_id ) {
+ array_push( $all_widgets, self::format_widget( $key, $widget_id, $sidebar ) );
+ }
+ }
+
+ return $all_widgets;
+ }
+
+ /**
+ * Return an array of all active widgets formatted for output.
+ *
+ * @return array An array of all active widgets (see format_widget).
+ */
+ public static function get_active_widgets() {
+ $active_widgets = array();
+ $all_widgets = self::get_all_widgets();
+ foreach( $all_widgets as $widget ) {
+ if ( 'wp_inactive_widgets' === $widget['sidebar'] ) {
+ continue;
+ }
+ array_push( $active_widgets, $widget );
+ }
+ return $active_widgets;
+ }
+
+ /**
+ * Return an array of all widget IDs (active and inactive)
+ *
+ * @return array An array of all widget IDs.
+ */
+ public static function get_all_widget_ids() {
+ $all_widgets = array();
+ $sidebars_widgets = self::get_all_sidebars();
+ foreach ( array_values( $sidebars_widgets ) as $widgets ) {
+ if ( ! is_array( $widgets ) ) {
+ continue;
+ }
+ foreach ( array_values( $widgets ) as $widget_id ) {
+ array_push( $all_widgets, $widget_id );
+ }
+ }
+ return $all_widgets;
+ }
+
+ /**
+ * Return an array of widgets with a specific id_base (eg: `text`).
+ *
+ * @param string $id_base The id_base of a widget type.
+ *
+ * @return array All the formatted widgets matching that widget type (see format_widget).
+ */
+ public static function get_widgets_with_id_base( $id_base ) {
+ $matching_widgets = array();
+ foreach ( self::get_all_widgets() as $widget ) {
+ if ( self::get_widget_id_base( $widget['id'] ) === $id_base ) {
+ array_push( $matching_widgets, $widget );
+ }
+ }
+ return $matching_widgets;
+ }
+
+ /**
+ * Return the array of widget IDs in a sidebar or null if that sidebar does
+ * not exist. Will return an empty array for an existing empty sidebar.
+ *
+ * @param string $sidebar The id of a sidebar.
+ *
+ * @return array|null The array of widget IDs in the sidebar.
+ */
+ public static function get_widgets_in_sidebar( $sidebar ) {
+ $sidebars = self::get_all_sidebars();
+
+
+ if ( ! $sidebars || ! is_array( $sidebars ) ) {
+ return null;
+ }
+ if ( ! $sidebars[ $sidebar ] && array_key_exists( $sidebar, $sidebars ) ) {
+ return array();
+ }
+ return $sidebars[ $sidebar ];
+ }
+
+ /**
+ * Return an associative array of all registered sidebars for this theme,
+ * active and inactive, including the hidden disabled widgets sidebar (keyed
+ * by `wp_inactive_widgets`). Each sidebar is keyed by the ID of the sidebar
+ * and its value is an array of widget IDs for that sidebar.
+ *
+ * @return array An associative array of all sidebars and their widget IDs.
+ */
+ public static function get_all_sidebars() {
+ $sidebars_widgets = self::get_sidebars_widgets();
+
+ if ( ! is_array( $sidebars_widgets ) ) {
+ return array();
+ }
+ return $sidebars_widgets;
+ }
+
+ /**
+ * Return an associative array of all active sidebars for this theme, Each
+ * sidebar is keyed by the ID of the sidebar and its value is an array of
+ * widget IDs for that sidebar.
+ *
+ * @return array An associative array of all active sidebars and their widget IDs.
+ */
+ public static function get_active_sidebars() {
+ $sidebars = array();
+ foreach ( self::get_all_sidebars() as $sidebar => $widgets ) {
+ if ( 'wp_inactive_widgets' === $sidebar || ! isset( $widgets ) || ! is_array( $widgets ) ) {
+ continue;
+ }
+ $sidebars[ $sidebar ] = $widgets;
+ }
+ return $sidebars;
+ }
+
+ /**
+ * Activates a widget in a sidebar. Does not validate that the sidebar exists,
+ * so please do that first. Also does not save the widget's settings. Please
+ * do that with `set_widget_settings`.
+ *
+ * If position is not set, it will be set to the next available position.
+ *
+ * @param string $widget_id The newly-formed id of the widget to be added.
+ * @param string $sidebar The id of the sidebar where the widget will be added.
+ * @param string|integer $position (Optional) The position within the sidebar where the widget will be added.
+ *
+ * @return bool
+ */
+ public static function add_widget_to_sidebar( $widget_id, $sidebar, $position ) {
+ return self::move_widget_to_sidebar( array( 'id' => $widget_id ), $sidebar, $position );
+ }
+
+ /**
+ * Removes a widget from a sidebar. Does not validate that the sidebar exists
+ * or remove any settings from the widget, so please do that separately.
+ *
+ * @param array $widget The widget to be removed.
+ */
+ public static function remove_widget_from_sidebar( $widget ) {
+ $sidebars_widgets = self::get_sidebars_widgets();
+ // Remove the widget from its old location and reflow the positions of the remaining widgets.
+ array_splice( $sidebars_widgets[ $widget['sidebar'] ], $widget['position'], 1 );
+
+ update_option( 'sidebars_widgets', $sidebars_widgets );
+ }
+
+ /**
+ * Moves a widget to a sidebar. Does not validate that the sidebar exists,
+ * so please do that first. Also does not save the widget's settings. Please
+ * do that with `set_widget_settings`. The first argument should be a
+ * widget as returned by `format_widget` including `id`, `sidebar`, and
+ * `position`.
+ *
+ * If $position is not set, it will be set to the next available position.
+ *
+ * Can be used to add a new widget to a sidebar if
+ * $widget['sidebar'] === NULL
+ *
+ * Can be used to move a widget within a sidebar as well if
+ * $widget['sidebar'] === $sidebar.
+ *
+ * @param array $widget The widget to be moved (see format_widget).
+ * @param string $sidebar The sidebar where this widget will be moved.
+ * @param string|integer $position (Optional) The position where this widget will be moved in the sidebar.
+ *
+ * @return bool
+ */
+ public static function move_widget_to_sidebar( $widget, $sidebar, $position ) {
+ $sidebars_widgets = self::get_sidebars_widgets();
+
+ // If a position is passed and the sidebar isn't empty,
+ // splice the widget into the sidebar, update the sidebar option, and return the result
+ if ( isset( $widget['sidebar'] ) && isset( $widget['position'] ) ) {
+ array_splice( $sidebars_widgets[ $widget['sidebar'] ], $widget['position'], 1 );
+ }
+
+ // Sometimes an existing empty sidebar is NULL, so initialize it.
+ if ( array_key_exists( $sidebar, $sidebars_widgets ) && ! is_array( $sidebars_widgets[ $sidebar ] ) ) {
+ $sidebars_widgets[ $sidebar ] = array();
+ }
+
+ // If no position is passed, set one from items in sidebar
+ if ( ! isset( $position ) ) {
+ $position = 0;
+ $last_position = self::get_last_position_in_sidebar( $sidebar );
+ if ( isset( $last_position ) && is_numeric( $last_position ) ) {
+ $position = $last_position + 1;
+ }
+ }
+
+ // Add the widget to the sidebar and reflow the positions of the other widgets.
+ if ( empty( $sidebars_widgets[ $sidebar ] ) ) {
+ $sidebars_widgets[ $sidebar ][] = $widget['id'];
+ } else {
+ array_splice( $sidebars_widgets[ $sidebar ], (int)$position, 0, $widget['id'] );
+ }
+
+ set_theme_mod( 'sidebars_widgets', array( 'time' => time(), 'data' => $sidebars_widgets ) );
+ return update_option( 'sidebars_widgets', $sidebars_widgets );
+ }
+
+ /**
+ * Return an integer containing the largest position number in a sidebar or
+ * null if there are no widgets in that sidebar.
+ *
+ * @param string $sidebar The id of a sidebar.
+ *
+ * @return integer|null The last index position of a widget in that sidebar.
+ */
+ public static function get_last_position_in_sidebar( $sidebar ) {
+ $widgets = self::get_widgets_in_sidebar( $sidebar );
+ if ( ! $widgets ) {
+ return null;
+ }
+ $last_position = 0;
+ foreach ( $widgets as $widget_id ) {
+ $widget = self::get_widget_by_id( $widget_id );
+ if ( intval( $widget['position'] ) > intval( $last_position ) ) {
+ $last_position = intval( $widget['position'] );
+ }
+ }
+ return $last_position;
+ }
+
+ /**
+ * Saves settings for a widget. Does not add that widget to a sidebar. Please
+ * do that with `move_widget_to_sidebar` first. Will merge the settings of
+ * any existing widget with the same `$widget_id`.
+ *
+ * @param string $widget_id The id of a widget.
+ * @param array $settings An associative array of settings to merge with any existing settings on this widget.
+ *
+ * @return boolean|WP_Error True if update was successful.
+ */
+ public static function set_widget_settings( $widget_id, $settings ) {
+ $widget_option_name = self::get_widget_option_name( $widget_id );
+ $widget_settings = get_option( $widget_option_name );
+ $instance_key = self::get_widget_instance_key( $widget_id );
+ $old_settings = $widget_settings[ $instance_key ];
+
+ if ( ! $settings = self::sanitize_widget_settings( $widget_id, $settings, $old_settings ) ) {
+ return new WP_Error( 'invalid_data', 'Update failed.', 500 );
+ }
+ if ( is_array( $old_settings ) ) {
+ // array_filter prevents empty arguments from replacing existing ones
+ $settings = wp_parse_args( array_filter( $settings ), $old_settings );
+ }
+
+ $widget_settings[ $instance_key ] = $settings;
+
+ return update_option( $widget_option_name, $widget_settings );
+ }
+
+ /**
+ * Sanitize an associative array for saving.
+ *
+ * @param string $widget_id The id of a widget.
+ * @param array $settings A widget settings array.
+ * @param array $old_settings The existing widget settings array.
+ *
+ * @return array|false The settings array sanitized by `WP_Widget::update` or false if sanitization failed.
+ */
+ private static function sanitize_widget_settings( $widget_id, $settings, $old_settings ) {
+ if ( ! $widget = self::get_registered_widget_object( self::get_widget_id_base( $widget_id ) ) ) {
+ return false;
+ }
+ $new_settings = $widget->update( $settings, $old_settings );
+ if ( ! is_array( $new_settings ) ) {
+ return false;
+ }
+ return $new_settings;
+ }
+
+ /**
+ * Deletes settings for a widget. Does not remove that widget to a sidebar. Please
+ * do that with `remove_widget_from_sidebar` first.
+ *
+ * @param array $widget The widget which will have its settings removed (see format_widget).
+ */
+ public static function remove_widget_settings( $widget ) {
+ $widget_option_name = self::get_widget_option_name( $widget['id'] );
+ $widget_settings = get_option( $widget_option_name );
+ unset( $widget_settings[ self::get_widget_instance_key( $widget['id'] ) ] );
+ update_option( $widget_option_name, $widget_settings );
+ }
+
+ /**
+ * Update a widget's settings, sidebar, and position. Returns the (updated)
+ * formatted widget if successful or a WP_Error if it fails.
+ *
+ * @param string $widget_id The id of a widget to update.
+ * @param string $sidebar (Optional) A sidebar to which this widget will be moved.
+ * @param string|integer (Optional) A new position to which this widget will be moved within its new or existing sidebar.
+ * @param array|object|string $settings Settings to merge with the existing settings of the widget (will be passed through `decode_settings`).
+ *
+ * @return array|WP_Error The newly added widget as an associative array with all the above properties.
+ */
+ public static function update_widget( $widget_id, $sidebar, $position, $settings ) {
+ $settings = self::decode_settings( $settings );
+ if ( isset( $settings ) && ! is_array( $settings ) ) {
+ return new WP_Error( 'invalid_data', 'Invalid settings', 400 );
+ }
+ // Default to an empty array if nothing is specified.
+ if ( ! is_array( $settings ) ) {
+ $settings = array();
+ }
+ $widget = self::get_widget_by_id( $widget_id );
+ if ( ! $widget ) {
+ return new WP_Error( 'not_found', 'No widget found.', 400 );
+ }
+ if ( ! $sidebar ) {
+ $sidebar = $widget['sidebar'];
+ }
+ if ( ! isset( $position ) ) {
+ $position = $widget['position'];
+ }
+ if ( ! is_numeric( $position ) ) {
+ return new WP_Error( 'invalid_data', 'Invalid position', 400 );
+ }
+ $widgets_in_sidebar = self::get_widgets_in_sidebar( $sidebar );
+ if ( ! isset( $widgets_in_sidebar ) ) {
+ return new WP_Error( 'invalid_data', 'No such sidebar exists', 400 );
+ }
+ self::move_widget_to_sidebar( $widget, $sidebar, $position );
+ $widget_save_status = self::set_widget_settings( $widget_id, $settings );
+ if ( is_wp_error( $widget_save_status ) ) {
+ return $widget_save_status;
+ }
+ return self::get_widget_by_id( $widget_id );
+ }
+
+ /**
+ * Deletes a widget entirely including all its settings. Returns a WP_Error if
+ * the widget could not be found. Otherwise returns an empty array.
+ *
+ * @param string $widget_id The id of a widget to delete. (eg: 'text-2')
+ *
+ * @return array|WP_Error An empty array if successful.
+ */
+ public static function delete_widget( $widget_id ) {
+ $widget = self::get_widget_by_id( $widget_id );
+ if ( ! $widget ) {
+ return new WP_Error( 'not_found', 'No widget found.', 400 );
+ }
+ self::remove_widget_from_sidebar( $widget );
+ self::remove_widget_settings( $widget );
+ return array();
+ }
+
+ /**
+ * Return an array of settings. The input can be either an object, a JSON
+ * string, or an array.
+ *
+ * @param array|string|object $settings The settings of a widget as passed into the API.
+ *
+ * @return array Decoded associative array of settings.
+ */
+ public static function decode_settings( $settings ) {
+ // Treat as string in case JSON was passed
+ if ( is_object( $settings ) && property_exists( $settings, 'scalar' ) ) {
+ $settings = $settings->scalar;
+ }
+ if ( is_object( $settings ) ) {
+ $settings = (array) $settings;
+ }
+ // Attempt to decode JSON string
+ if ( is_string( $settings ) ) {
+ $settings = (array) json_decode( $settings );
+ }
+ return $settings;
+ }
+
+ /**
+ * Activate a new widget.
+ *
+ * @param string $id_base The id_base of the new widget (eg: 'text')
+ * @param string $sidebar The id of the sidebar where this widget will go. Dependent on theme. (eg: 'sidebar-1')
+ * @param string|integer $position (Optional) The position of the widget in the sidebar. Defaults to the last position.
+ * @param array|object|string $settings (Optional) An associative array of settings for this widget (will be passed through `decode_settings`). Varies by widget.
+ *
+ * @return array|WP_Error The newly added widget as an associative array with all the above properties except 'id_base' replaced with the generated 'id'.
+ */
+ public static function activate_widget( $id_base, $sidebar, $position, $settings ) {
+ if ( ! isset( $id_base ) || ! self::validate_id_base( $id_base ) ) {
+ return new WP_Error( 'invalid_data', 'Invalid ID base', 400 );
+ }
+
+ if ( ! isset( $sidebar ) ) {
+ return new WP_Error( 'invalid_data', 'No sidebar provided', 400 );
+ }
+
+ if ( isset( $position ) && ! is_numeric( $position ) ) {
+ return new WP_Error( 'invalid_data', 'Invalid position', 400 );
+ }
+
+ $settings = self::decode_settings( $settings );
+ if ( isset( $settings ) && ! is_array( $settings ) ) {
+ return new WP_Error( 'invalid_data', 'Invalid settings', 400 );
+ }
+
+ // Default to an empty array if nothing is specified.
+ if ( ! is_array( $settings ) ) {
+ $settings = array();
+ }
+
+ $widget_counter = 1 + self::get_last_widget_instance_key_with_id_base( $id_base );
+ $widget_id = $id_base . '-' . $widget_counter;
+ if ( 0 >= $widget_counter ) {
+ return new WP_Error( 'invalid_data', 'Error creating widget ID' . $widget_id, 500 );
+ }
+ if ( self::get_widget_by_id( $widget_id ) ) {
+ return new WP_Error( 'invalid_data', 'Widget ID already exists', 500 );
+ }
+
+ self::add_widget_to_sidebar( $widget_id, $sidebar, $position );
+ $widget_save_status = self::set_widget_settings( $widget_id, $settings );
+ if ( is_wp_error( $widget_save_status ) ) {
+ return $widget_save_status;
+ }
+
+ // Add a Tracks event for non-Headstart activity.
+ if ( ! defined( 'HEADSTART' ) ) {
+ $tracking = new Automattic\Jetpack\Tracking();
+ $tracking->tracks_record_event(
+ wp_get_current_user(),
+ 'wpcom_widgets_activate_widget',
+ array(
+ 'widget' => $id_base,
+ 'settings' => wp_json_encode( $settings ),
+ )
+ );
+ }
+
+ return self::get_widget_by_id( $widget_id );
+ }
+
+ /**
+ * Activate an array of new widgets. Like calling `activate_widget` multiple times.
+ *
+ * @param array $widgets An array of widget arrays. Each sub-array must be of the format required by `activate_widget`.
+ *
+ * @return array|WP_Error The newly added widgets in the form returned by `get_all_widgets`.
+ */
+ public static function activate_widgets( $widgets ) {
+ if ( ! is_array( $widgets ) ) {
+ return new WP_Error( 'invalid_data', 'Invalid widgets', 400 );
+ }
+
+ $added_widgets = array();
+
+ foreach( $widgets as $widget ) {
+ $added_widgets[] = self::activate_widget( $widget['id_base'], $widget['sidebar'], $widget['position'], $widget['settings'] );
+ }
+
+ return $added_widgets;
+ }
+
+ /**
+ * Return the last instance key (integer) of an existing widget matching
+ * `$id_base`. So if you pass in `text`, and there is a widget with the id
+ * `text-2`, this function will return `2`.
+ *
+ * @param string $id_base The id_base of a type of widget. (eg: 'rss')
+ *
+ * @return integer The last instance key of that type of widget.
+ */
+ public static function get_last_widget_instance_key_with_id_base( $id_base ) {
+ $similar_widgets = self::get_widgets_with_id_base( $id_base );
+
+ if ( ! empty( $similar_widgets ) ) {
+ // If the last widget with the same name is `text-3`, we want `text-4`
+ usort( $similar_widgets, __CLASS__ . '::sort_widgets' );
+
+ $last_widget = array_pop( $similar_widgets );
+ $last_val = intval( self::get_widget_instance_key( $last_widget['id'] ) );
+
+ return $last_val;
+ }
+
+ return 0;
+ }
+
+ /**
+ * Method used to sort widgets
+ *
+ * @since 5.4
+ *
+ * @param array $a
+ * @param array $b
+ *
+ * @return int
+ */
+ public static function sort_widgets( $a, $b ) {
+ $a_val = intval( self::get_widget_instance_key( $a['id'] ) );
+ $b_val = intval( self::get_widget_instance_key( $b['id'] ) );
+ if ( $a_val > $b_val ) {
+ return 1;
+ }
+ if ( $a_val < $b_val ) {
+ return -1;
+ }
+ return 0;
+ }
+
+ /**
+ * Retrieve a given widget object instance by ID base (eg. 'text' or 'archives').
+ *
+ * @param string $id_base The id_base of a type of widget.
+ *
+ * @return WP_Widget|false The found widget object or false if the id_base was not found.
+ */
+ public static function get_registered_widget_object( $id_base ) {
+ if ( ! $id_base ) {
+ return false;
+ }
+
+ // Get all of the registered widgets.
+ global $wp_widget_factory;
+ if ( ! isset( $wp_widget_factory ) ) {
+ return false;
+ }
+
+ $registered_widgets = $wp_widget_factory->widgets;
+ if ( empty( $registered_widgets ) ) {
+ return false;
+ }
+
+ foreach ( array_values( $registered_widgets ) as $registered_widget_object ) {
+ if ( $registered_widget_object->id_base === $id_base ) {
+ return $registered_widget_object;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Validate a given widget ID base (eg. 'text' or 'archives').
+ *
+ * @param string $id_base The id_base of a type of widget.
+ *
+ * @return boolean True if the widget is of a known type.
+ */
+ public static function validate_id_base( $id_base ) {
+ return ( false !== self::get_registered_widget_object( $id_base ) );
+ }
+
+ /**
+ * Insert a new widget in a given sidebar.
+ *
+ * @param string $widget_id ID of the widget.
+ * @param array $widget_options Content of the widget.
+ * @param string $sidebar ID of the sidebar to which the widget will be added.
+ *
+ * @return WP_Error|true True when data has been saved correctly, error otherwise.
+ */
+ static function insert_widget_in_sidebar( $widget_id, $widget_options, $sidebar ) {
+ // Retrieve sidebars, widgets and their instances
+ $sidebars_widgets = get_option( 'sidebars_widgets', array() );
+ $widget_instances = get_option( 'widget_' . $widget_id, array() );
+
+ // Retrieve the key of the next widget instance
+ $numeric_keys = array_filter( array_keys( $widget_instances ), 'is_int' );
+ $next_key = $numeric_keys ? max( $numeric_keys ) + 1 : 2;
+
+ // Add this widget to the sidebar
+ if ( ! isset( $sidebars_widgets[ $sidebar ] ) ) {
+ $sidebars_widgets[ $sidebar ] = array();
+ }
+ $sidebars_widgets[ $sidebar ][] = $widget_id . '-' . $next_key;
+
+ // Add the new widget instance
+ $widget_instances[ $next_key ] = $widget_options;
+
+ // Store updated sidebars, widgets and their instances
+ if (
+ ! ( update_option( 'sidebars_widgets', $sidebars_widgets ) )
+ || ( ! ( update_option( 'widget_' . $widget_id, $widget_instances ) ) )
+ ) {
+ return new WP_Error( 'widget_update_failed', 'Failed to update widget or sidebar.', 400 );
+ };
+
+ return true;
+ }
+
+ /**
+ * Update the content of an existing widget in a given sidebar.
+ *
+ * @param string $widget_id ID of the widget.
+ * @param array $widget_options New content for the update.
+ * @param string $sidebar ID of the sidebar to which the widget will be added.
+ *
+ * @return WP_Error|true True when data has been updated correctly, error otherwise.
+ */
+ static function update_widget_in_sidebar( $widget_id, $widget_options, $sidebar ) {
+ // Retrieve sidebars, widgets and their instances
+ $sidebars_widgets = get_option( 'sidebars_widgets', array() );
+ $widget_instances = get_option( 'widget_' . $widget_id, array() );
+
+ // Retrieve index of first widget instance in that sidebar
+ $widget_key = false;
+ foreach ( $sidebars_widgets[ $sidebar ] as $widget ) {
+ if ( strpos( $widget, $widget_id ) !== false ) {
+ $widget_key = absint( str_replace( $widget_id . '-', '', $widget ) );
+ break;
+ }
+ }
+
+ // There is no widget instance
+ if ( ! $widget_key ) {
+ return new WP_Error( 'invalid_data', 'No such widget.', 400 );
+ }
+
+ // Update the widget instance and option if the data has changed
+ if ( $widget_instances[ $widget_key ]['title'] !== $widget_options['title']
+ || $widget_instances[ $widget_key ]['address'] !== $widget_options['address']
+ ) {
+
+ $widget_instances[ $widget_key ] = array_merge( $widget_instances[ $widget_key ], $widget_options );
+
+ // Store updated widget instances and return Error when not successful
+ if ( ! ( update_option( 'widget_' . $widget_id, $widget_instances ) ) ) {
+ return new WP_Error( 'widget_update_failed', 'Failed to update widget.', 400 );
+ };
+ };
+ return true;
+ }
+
+ /**
+ * Retrieve the first active sidebar.
+ *
+ * @return string|WP_Error First active sidebar, error if none exists.
+ */
+ static function get_first_sidebar() {
+ $active_sidebars = get_option( 'sidebars_widgets', array() );
+ unset( $active_sidebars[ 'wp_inactive_widgets' ], $active_sidebars[ 'array_version' ] );
+
+ if ( empty( $active_sidebars ) ) {
+ return false;
+ }
+ $active_sidebars_keys = array_keys( $active_sidebars );
+ return array_shift( $active_sidebars_keys );
+ }
+}
diff --git a/wp-content/plugins/jetpack/_inc/polldaddy-shortcode.js b/wp-content/plugins/jetpack/_inc/polldaddy-shortcode.js
new file mode 100644
index 000000000..55c28fdfd
--- /dev/null
+++ b/wp-content/plugins/jetpack/_inc/polldaddy-shortcode.js
@@ -0,0 +1,74 @@
+( function( $ ) {
+ window.polldaddyshortcode = {
+ render: function() {
+ var ratings = $( 'div.pd-rating[data-settings]' );
+ var polls = $( 'div.PDS_Poll[data-settings]' );
+
+ if ( polls ) {
+ $.each( polls, function() {
+ var poll = $( this ).data( 'settings' );
+
+ if ( poll ) {
+ var poll_url = document.createElement( 'a' );
+ poll_url.href = poll[ 'url' ];
+ if (
+ poll_url.hostname != 'secure.polldaddy.com' &&
+ poll_url.hostname != 'static.polldaddy.com'
+ ) {
+ return false;
+ }
+ var pathname = poll_url.pathname;
+ if ( ! /\/?p\/\d+\.js/.test( pathname ) ) {
+ return false;
+ }
+ var wp_pd_js = document.createElement( 'script' );
+ wp_pd_js.type = 'text/javascript';
+ wp_pd_js.src = poll[ 'url' ];
+ wp_pd_js.charset = 'utf-8';
+ wp_pd_js.async = true;
+ document.getElementsByTagName( 'head' )[ 0 ].appendChild( wp_pd_js );
+ }
+ } );
+ }
+
+ if ( ratings ) {
+ var script = '';
+
+ $.each( ratings, function() {
+ var rating = $( this ).data( 'settings' );
+
+ if ( rating ) {
+ script +=
+ 'PDRTJS_settings_' +
+ rating[ 'id' ] +
+ rating[ 'item_id' ] +
+ '=' +
+ rating[ 'settings' ] +
+ "; if ( typeof PDRTJS_RATING !== 'undefined' ){ if ( typeof PDRTJS_" +
+ rating[ 'id' ] +
+ rating[ 'item_id' ] +
+ "=='undefined' ){PDRTJS_" +
+ rating[ 'id' ] +
+ rating[ 'item_id' ] +
+ '= new PDRTJS_RATING( PDRTJS_settings_' +
+ rating[ 'id' ] +
+ rating[ 'item_id' ] +
+ ' );}}';
+ }
+ } );
+
+ if ( script.length > 0 )
+ $( '#polldaddyRatings' ).after(
+ "'
+ );
+ }
+ },
+ };
+
+ $( 'body' ).on( 'post-load pd-script-load', function() {
+ window.polldaddyshortcode.render();
+ } );
+ $( 'body' ).trigger( 'pd-script-load' );
+} )( jQuery );
diff --git a/wp-content/plugins/jetpack/_inc/postmessage.js b/wp-content/plugins/jetpack/_inc/postmessage.js
new file mode 100644
index 000000000..51f8567b2
--- /dev/null
+++ b/wp-content/plugins/jetpack/_inc/postmessage.js
@@ -0,0 +1,438 @@
+/**
+ The MIT License
+
+ Copyright (c) 2010 Daniel Park (http://metaweb.com, http://postmessage.freebaseapps.com)
+
+ 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.
+ **/
+var NO_JQUERY = {};
+(function(window, $, undefined) {
+
+ if (!("console" in window)) {
+ var c = window.console = {};
+ c.log = c.warn = c.error = c.debug = function(){};
+ }
+
+ if ($ === NO_JQUERY) {
+ // jQuery is optional
+ $ = {
+ fn: {},
+ extend: function() {
+ var a = arguments[0];
+ for (var i=1,len=arguments.length; i
+
+
+
+ social-logos
+
+
+
+
social-logos
+
+
+
+
social-logo__amazon
+
+
social-logo__behance
+
+
social-logo__blogger-alt
+
+
social-logo__blogger
+
+
social-logo__codepen
+
+
social-logo__dribbble
+
+
social-logo__dropbox
+
+
social-logo__eventbrite
+
+
social-logo__facebook
+
+
social-logo__feed
+
+
social-logo__flickr
+
+
social-logo__foursquare
+
+
social-logo__ghost
+
+
social-logo__github
+
+
social-logo__google-plus-alt
+
+
social-logo__google-plus
+
+
social-logo__instagram
+
+
social-logo__linkedin
+
+
social-logo__mail
+
+
social-logo__medium
+
+
social-logo__path-alt
+
+
social-logo__path
+
+
social-logo__pinterest-alt
+
+
social-logo__pinterest
+
+
social-logo__pocket
+
+
social-logo__polldaddy
+
+
social-logo__print
+
+
social-logo__reddit
+
+
social-logo__share
+
+
social-logo__skype
+
+
social-logo__spotify
+
+
social-logo__squarespace
+
+
social-logo__stumbleupon
+
+
social-logo__telegram
+
+
social-logo__tumblr-alt
+
+
social-logo__tumblr
+
+
social-logo__twitch
+
+
social-logo__twitter-alt
+
+
social-logo__twitter
+
+
social-logo__vimeo
+
+
social-logo__whatsapp
+
+
social-logo__wordpress
+
+
social-logo__xanga
+
+
social-logo__youtube
+
+
+
+
+
+
Usage
+
<i class="social-logo social-logo__name"></i>
+
+
+
+
+
+
+
diff --git a/wp-content/plugins/jetpack/_inc/social-logos/social-logos.min.css b/wp-content/plugins/jetpack/_inc/social-logos/social-logos.min.css
new file mode 100644
index 000000000..f5223f300
--- /dev/null
+++ b/wp-content/plugins/jetpack/_inc/social-logos/social-logos.min.css
@@ -0,0 +1 @@
+@font-face{font-family:social-logos;src:url(social-logos.eot?51b607ee5b5cb2a0e4517176475a424c);font-weight:400;font-style:normal}@font-face{font-family:social-logos;src:url(social-logos.eot?51b607ee5b5cb2a0e4517176475a424c);src:url(social-logos.eot?#iefix) format("embedded-opentype"),url("data:application/font-woff;charset=utf-8;base64,d09GRk9UVE8AAEZAAAoAAAAAfBAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABDRkYgAAAA9AAAQsUAAHZfa1y5A0ZGVE0AAEO8AAAAGQAAABx4Dt9ZT1MvMgAAQ9gAAABKAAAAYEC7Yj5jbWFwAABEJAAAAIUAAAG6pEWcoGhlYWQAAESsAAAALwAAADYHEbeJaGhlYQAARNwAAAAdAAAAJAOvAd5obXR4AABE/AAAADgAAABeCDEE521heHAAAEU0AAAABgAAAAYALVAAbmFtZQAARTwAAADrAAAB5koHYmpwb3N0AABGKAAAABYAAAAg/8MAGnicrZ13mJXFFfDn3XbvVnb37i596SC9d8uLDQyKFXtD7F0RYzSGay9LDCpqjB1REaPR2CXCFbGB2ACR3otLWdje5zu/M++9QGK+fH98Dzyz804vZ86cOtczKSnG87zsKTdMvmrStX2vveGKG6YYL8l45qTaFqZ2rFc7Lqn2hOTaVinTs7zibW36ZyUXd3vVZqUUZ5jWp+fbkpJEJCv04mW102p7pbZLat2inTG57ZJuzmtn+rSb2jLf9KfJsGlhikx709X0NoPMSOObsWaCmWjON5PN1eYmc5uZZu43fzYzzTNmlnndvG0+NPPNF+Zbs8ysNpvMTlNmqk2Tl+Jlevlea6+j18Pr5w2Vf2O8k6Zef9XxAwcM5M+gAQPcn+BrkPsz2P0Z6v4Mc3+Guz8j9c9AV2+gqzfQ1Rvo6g0c4v646gNd9YGu+sAR7o9rZZBrZZCrPshVH+SqD3LVB2n1Ia6/Ia6HIa7pIcO0laHua6jraJib0TA3o2FuRsPcjIYNGOL+DHV/ggrD3Z8R7o+2Ocz1N2zgMfpn0OCDd/0QCDDGe8B70HvIe9gr8aZ7f/Ye8f7izfAe9R7zHvdmek94T3pPeX/1nvb+5j3jPes95z3vveC96L3kzfJe9mZ7r3iveq95c7zXvbneG97fvTe9t7x/eG9773j/NH2BhM5p96T3yXojZ11u18hThd1aprSe33Zru1uK7+w4otO5XWb1OXzIE0Orh/965AXH3nF8vxMyT2g48dyTcid0O3n/qS+fXnVG5TkF526/YPCkYya3vTx6xQ1Xzry2/Lpzb/joxqtvHlsyu2b6bG/27NoBs5NnF9VeUjO/8ZK02Q2vFNZMrx3QMD2UY83oVsaa7ta3dt3OmDV93ola0+1rSeu4WmLebAl63GystY9Jbo9r5bPoFAn6fChpy++Qcq23m3xres2V7JGLJbhgoWSPyJTsnx4i7QUpk5cpsSE3mshlF1vz6iRjveNv8gutvfeEmG2ue0Qypw2NpVmT+ZlfIuHtvvR8m6RmZkvlpEZih0la0m75TG+UIOV+CcLvSZDWVXLDz0ufaW34lJmYUKkEqV0lSF8guamtiTGOpL/42rx0kv27qIS518k4G1tJoezmmLW1qdJO5geyGLW5lHwxam1lWGLh3pJbtkFiKa9Gw5KzUlpLfZacjRILDaPrFozp+2g4ctmLklnH1woJkpN8nQmdDqHTrCHSaXOKZGWcLl01NNHMGOmqYYd0Hz5fuqofJ2lpsySt9nXmkkzsaSbeLHVr6C75FSlX9aHUSOprwhKdxQSPYMR/l5hXJLGKG/yScGToi1L5Qfl8oo5F/2K6ZB9xssx5WAtZL5NaHJNBpdRKATtHUlO+kkHZFsR+ItZNukjpJ7nNt0paMqvTBIAkz5MBNP3CAHZLWuMeYsMlrbGYkfQgFvGDkdTvl5nbuu2y9LayiazPYvdIwgUSbejC+OtOkpk15EtLNQ/Q8KNSq+pTxn+TAE3yCEmbMdbI+BfKoplxY6WPI5dFZfxZN7K0Ge2oxJ6H/ipt1B9BjIbq+0osWfbLVl8sE7Xl0wwjYVDN6xnZOAmaXmMjnpFCTX9nRDMAi28Z5n06IeZ8I7HD6OVcitxAA0Pp6oeYNiVzqGchXKszJdHeKc3UTzAlAjEfvCaLZzYygVoBJhN62bjyJkcaMQbIa9EiJiUf6uTLrEwDWZ/S9NdSPKdAGm18UtKy7yA2A5C9iyb+IBWzwoCsgJDJuDcajwms2+oOQNR1EqsAytKG+uHI6x3la7fUTxsv6ft3saktAe9SFmb/FDaq/GdmfJmkVrZiNmuIRZjsj9JnlWy/rd3HVp0pGTUZxCZJuZo28lk3hZ27mAU9Bhh8m9U6Q2pUKMCw0uXztKvF7Mf+kzjZ40i9HkgrYbCf+bIQKU/6rrpJu5wm7+JEnUg3gGT4TmK9TbD1dYdLuSwG2wCqcLERrNKtTOUpKZdTycEvvAtwyb8e+N4pqS3aSGPpG1n+8ZKWvgJsM1iayD1L0kJXSJEi3dyfQnJabPMoYKodrV9I7HTW+2Zi7xO7hDV6m5XfCjBNlFjVHazo/guYbCXoVYGxtjetv8w8R9dKH5NXCmiYtFHSSF2eCdahur8MxpOZ2fK5Ahr2jVYcWDMs6s6hMd/H3Nk03tnUecnEYws5gieRewP7ew4rO4RDexVpXfi8mlbuA49dww78SOx+zvAaVvxXGr2SdT6N9cr6ibXLmMa5ONZBkgy0hwlHugg4/X2qJJ1wT0xmcPXZMb0TBNu85qflWK9fL8m7orfxgkvipCFR6+UOlMSTjo0l18y03hMTQUsP95U6L94ZCwL57CAL9tInUvCIYkl4O1cGcwa4acuX0kzGXI5GAXPYxHgfY5SpfweVpYY5e9/LfLI5s3ar5Od9IRUXvQo8HgZUccX0vN6USBfV46Vkq7dY5LSgJUnd/QywM0qyCtaBBedHSzjGhdeAu/8IRj9Gaux6WJKtiSRJ6oZJUqO4TGqkT5Ygi0VOvZUd2c9QlvIJCKdfILG01lI4FUTyw2wW/jxp4Dt2O/9spnDqAsKWx/u6/tIBF2H2a6AEhStt7Bo/uB4K/w7MCvYy7c+NhRlQ3i4KfCophy2Q8lsvM8ElrICRD3JMYqPyOwNFhUHMWi5OcvWYag09xOawjyVoSw9524HwY1gjk8kVtPmVYBi2lEPctAyk9ELMDdfuLwKEDpfY7lqOwc6PZYDWvtWC+crVbfdUsAa3+e4AmdCcqMMgJm0ZO9JIpd3ZnJ0tAquyD1JyZxXfdZnkyVA4UUAjq57xM1NrKcEZHLV2IwGfHAlO3sqKXjiUAzd1WQBq5qK7fQW14hwZPtBZvExqzftRgg4fS3MzdknQYVI0DrwdBPN4Vwu+MZ2u9AFeahV2zLDm3T1S8qOOcgRszQZpfunJrM12CZZz3a/sKB1tPRfggWDJFKpLAE/GNRQUsRNkMOZP8jmS9UrvIW0N6svypXHWQDnN6eCgx4+UelP7c4uUsmHVb8py7SgDRYOxt3/O/bpiHcuzqo+0lCO0lt3UDgBnk5NPkFjauxJ03SyfY4Gvy7+Wcl2YsbmEoKNkmCsIuvvxGGmtZ0pTn4IgMp6Q2NdcwEngvH2pjGwge9Z3J/PfvF2iHUHUe31potc8KWmEIDT9lrEH3hoT3HfeGnqA0tK0UBUguFpiZ5/IPbpKYudBPLU9kiMyJOpuHkcDKbmTItegrQLOmp7kpJ+aiB1PbBYAM1pis+Rg200vSGxpnQRv9peMhs3uEpOxr0iWTl7oFhX0lclCjHhE2u4OOdnPyucgCNBWGZweSII6sGLHx2U0P22SesVyau1iCLm5MUn7FYrmPWghcyp34yrWry1Q9wDEVclKwXUmG7IteQIbBAx4X3Cw/8ni9BsPHuvFrbL3ORlAR4EMu+UWaakRirtBELndyqzXtJceFwghaHcIoNrNnaXwMFkxux7M3beAU1gD8HwKTfHh51JlYR4IurWgH7vJSKEWgrDsL/cEu2yXQ5bVQV17YyX2+WcmIFU/v8gEN1vzR1I4mZ6bAaLkLsAzhE0ySLWRCya8AZxR7jvi1zZ8RkyQqzlGWjFtp3HGpkvnPbjDk5WM7u+H5Z5YLaSrN+YFQHsfsFMH8inrSBsCtXbvePDeFvBTXoxzLtWzt0iQ110+0x6QhgpulCJlhVy57PKe4xj2e6Ce7Ci0qHzu4xLJk0Nlf4VeyBA8ZbcvA498P4dD88v3UQ00QSnWTuzkIsZzGhD7J2JPcxd/6McCInzB3ZLTWQZklwvBbIZASdfeJr1V5Eus4Q3OiGKssirInk1wIi3gqbZxvbT8YyyY8X6YLQMtUX4viyOLaCu53NOm02HzVhPidD/JEsqlatdyRR0mM7I19dEABzcpGwMz0bw3pgwNOPJC0EI9jZpHAIxX2GRQSyY7uI5hdDwL/PFPabE7K22PlyY2Z0mwE85hNXdCuSfBz5YW5dywOGkmgJ06MJb5HtaoOzTrDuiyfilgsHukyYHXAdsvGcKz2YL7LoacmPIOwJ78Lf2VAk9fcnSXA2OATR54K+tkCXLkLjAtrgVxCg1p8h6JhnOk5kw5EmYkV92Y4VJ+WDf5HOX5+UusWQrPN3qtZP0e6nSRYF4z+lUTqbTe3B9NbUGhbZ57IfRc5cmg0btiQSCfHSRrcjQkceFOTfqfgnyT+XasWE4SVyQd26Vyc5mR1SCILNDc+zAjA5+W72IoirZgrj5HGalT2F9JzhGclmukUip3gx2vN+G3PcHQp5FQH02N1AboXA96JQe9bJjpIMc9ialONqGAlfsyXYLvCqA+7DVCXJtJa/ySVB2kG7ML5LMDc544S2pqppuLzkrmmrj3CgWxe21nAJnfAY/QZ8TMGUe63DiPrwXHjJVZHtZWgiJolsJH/cjz1kvmhP9jNGh01H4Z3oV/9FMD+LAZYBluedsRSLmHLR8Q1atdZiS8ji2FY2rsAgqdyzHZ05Mjs+cXqZgEYt37ncRSc8DXt04yNScWypK2BVsrp91mMsdZSBHTchUI7zwh8GzqKSbV2hhXTQeh8u0yQflmzNPw4OP3CM/p5pH+j2ghh/OxmLKiQtSx9tXHSbCjBVfbbgjAWJHkfPK2NCBkWmpkvqzmw6B2mPKMqzhPw31oogzIKokHfFsLJqk3lL3CsN8bS2MBc7urPFocWS9T7Cotb4TZSLo+WtLBFdeGtQm7D3KfZq2dFKOL9MWxoHWVH9CwUH6CGu1bwu7Znzl2d8OhfNJDan6/yLjhsrluuJNjB4YLM/3vw4UFllaBrY1wecFwOfKNl7E3itUhG20DCF0phc5wG0NkO2XzJeg8Wfo+JgnAH7iLFe8L37p7JyXh1zYuYmmBAaUNglhbXwUOie0vB0HLzkh07yR6VsBMbxtzWSb9E5DrQJlUSJg3WwHDFwa4yv7KaHeOZWm6gz1OO5vLL6dOSm1FPhLmFG0EZVrIjvVzaP1jWK1Vc6X+Qg7rl5Re/zmX9yiBTvP6ZIEnk8H02p4DlnpVGircwuwit4DbQi2kUftnX1G2xMCCaW2Qbpz1btQ2fzcrKrRi/Mj9SRC0kJEy7a5TJeh4uBTuFiFNCBVy40TnxGbuF/j8wT/K5+khzl2KSfBOnTKEvmwRs83Lj4WR+oG7ZNVJ0lp3Lun+0rML9DOe1kFOypmMOQJZXXMzWFZ4F5C8DHfH78H83eX82jqIk9R1Mp0qYcOUMbRlq2LCDNktl8rK7YRz2gmFv3lTENAyadJmuycFn5pORSr34i4rEv7FJMGAZD8KBPygRGch0r+OgNEpG2KhACLr/0LWPumvfjsQUIs0zaRKzndv+o7QsWv3gAe7qYhlvhxZc/zlgn/stolRAv8awQwwihJ9w0UJ3tAEotE07pERi6XhD8dI0DoTSAemS4RRtks6A9Pr9EYZsU2yvkJYMOQiCY6AEu7COSDDHDWfWJUUH7HAjzwlOHL2sb5eMx/+Xu4Fu49VqngiGgTy2UGzQi7LZF0dZJkWp/rF1hv3ILeJxF2WC+Szg2aFXJaroFWlkWJrs18SKPhosSmMLOGOgHjVaY00jGHLfb7OsDCyUnL3CA1q90MF5YBZuZ0cY4jQyeSADfInmCAj52sKDxL42IPsZ89CPodr4GuabPL+HyQqkCXL/5WcA3NOO4QVhUdxJF72OTKQFF9K9c0XSskGMPROaMSdbWXG9hWYYV1fHfIwWUO7vRI8s9iEIi9HnWDP5FwusfwnjMNVpu0HPls/ci54ba5UWZ0FfMzhznxmWjQUP2znCaFm3kQ03WelxLr9TmIndzwglIBc6MEl1R2uY8xMiZ1qovM0538KKV55iX0XcLf/XEK75/sBnldeL3cjmByhOWIRkwJVoeKnZK6j3JclVojc8pwrETFAVkEgZn3FpnCY2isrPlCKFSFKKbyM+oOkufBi6accVqHsuSjj2PNPbnWYzK0v+Y6Wt9uFPBdOQGKlMUDoLYntBQcUVOjKdUPq376nZPUQItKMfF+yBiOFXQN70gVp7xIg9vMJnLaLpLGfBBPZH/a5Hv8eDbDe7jNAvd+DJk6RJrwFsYBcN0qMwupbkAoCY9t8ngR1R/t6nzgaEXpIclV0I7hMhfJS2HdY1DYgI/M2cqrP5bhQrUywjOleCWrpMJ5L/xjY2wHbpNMjEJCcz2X0OyFazUg6WII08uOHpMUP/ijBj0Jt20VIuBfM4eyUTgbH7HpDimcibK4TVGCyj9NbkCnZlcpTIhOtTmFEfSW2B+FiBdKfnYtBo8yBc2AiNTSBLLEQvrWRK6ewGayp0gcVPLhAP/9TItFBWKI02W8HeGaSsGRmPPqIT5+V4LWh0vzLN0jRz+n8fYbxxi2CU+yWJ7g9tyHez+kgqdVcfrkfQzjY/ful7LfvMJ6XJFYBiqvmolrXH3wK/fu90OG2iTPbeAdgizyy6VOJNSIwMLtMcL8lvU2sI1dDusSqRwE78C9hxFldHpZYKndZQYV8tkVgd+PzAXjX/BWwRxzR8hsp1g1MXPQcCAIRSjvEZi3hBiBY7N7PZWS7LowBbDshE/fB0K1D8l0L57MRigGO3G4bQnfPSKwUjNX24SiLPZAt6H6cBIMulNRx4FqfC/L7b6THPrBq85DFvM3p/VEOmf0Skcqiz1yPiH/S4YZ3jAYu7uPAcSshWlXprjGnmUBp4KQPMJ1NcqZsDXxdw5FxlOmA+liAnyk1ZNEAoNFcL7n1IKEk0OLaZlDbc0wDln5gHoxSj0kA+RlfSc++3LTmpJ+k+B+MzDBHyAOGsWJi1HuDP2AIufyIJVvzsLTrCYZD7TPRP+88/aPBvPOEqKHXUXOj8+Yl4rHz5pENeVA6N1qk8f+sFtWi/1nN78B1+hAc2RNg1ItLhYjx1sn8vR69kW8nQaGPlD2xpdAz7ZHV/CTTVqm1XXgLhxys9bOgS7vud6wCGPcjIdZM5gm+U0mZDEFnJonCwsBLh0Uq/EUxaCtAUyp2384+Ns+RtH0vA+cwTL/+Q4I9yE1VarkHJcVmSEwkv3a/cPi2+iPgxlaGoQerBLYFNo2rbvoeFT/K2WxzvSdpnWSyqvwww6ZHAw3ioL8wcMReLZ/jdHE6qWb3TzbBmEq5psoRn+mNuB2YoIbd/a+o4iJipLUkbSFkrMqht7WGp4qgKMwGc6OidErP5NNZihZjWIocJIY7ixjo76TSD1BimYJB7fLB1Nkdc1JJk1keDdLykNj/MAx8BSOxUyV+22mr5xdA4OB8bojREhx+rnQ24SYJRsH2jG/vO3GEGY3ehd0zvUfEAMx+vqCvLrcnLtnXx0aTrfdjnkBD4cmxQjBSAwKg9uDUClQuWYItbBlYIc+AXcHiBsarZg6xBokt4vpMgWl/9SbhYNgr+71JozESXAHbAKdbw13XbNly0CsiBlu2iCAl6NBWZBs3CLv5b75DTw3z4lu27g45BnbDy35I49LtsaTeakqKYZ1Semo1Sc9CLFiRBaIFjeyF7irkFkTa4nhtNIWmc2cQqWyruR5SW06+TEBaOgfqRYWso2HfU84Aj8IQerIKJr+vcaugrZtcWQXtUVbLd6OQFXS4VUdoOiPo6fwwNFnH86GmSdB5mc4PxUrkrkuCUp9yDqSarZfk36MimYKY7fOVwmNLQyfL2pmy34NwVkc9IX+fFHrMjIblfXNdLFmvJSFvOwvr8ZCQhc3fv4Xgbonw49aiBNyN2KB7CwCozRLEQhN8aX2HrD4qEhlTV+iFbJBEeIEkdlwEAkSOkg92UY4SMaRbAuQFxjyuGL0LusqFiGT7l8os1swDmRN7/0aYCIPAtAqttGqqVaUT6RtvI+08Gkf/Gkbu6XE7pKC8SurMEVMEv+6XqLA9DS9ysYAvdk/lXIND9qKGtG8ZgLuPgKBpDxPQh+16XEVZJ6xATnItIApqM33Yjsc/iDq2RbKlkc3gLakYedZ6j6PEWzedpVv/mEmL/A0ZAMgKCak3xVcFbomKvQXO5yNZW9JexrCEK0s/gzRpZshmqTNmbKwYrp4b0EMir4rNJBSr6VNgt9Y/II1ecD/sgIqm00BuqjkJ9xYqyEtfAd+BuYNmuSDcHSZu1h+ioci/AtH9FZMQ80hGUFvbqVkOIb/sAz9oXbNcIJ9ylpa9gwDr3zvuLrVMnxNiv91x5BdrWVF4FVmnlYi81yPbXC/MgfskMJ3yfJdhDoOd04A0F8inTOEwBLlaRktLvWJmxDY0V3dFQNDqZuAFrKRBq9vguOT6DUU+0S8Bh55Bpt3xgKxY8y9PI0bc8ecgywWSJfzdL7OZ7g6oPK2gVaWHYva+x7XCfApmRAPX9TPp9Xn4rq7o51zsQyPHbIVQFl7yVczcVnEIxoLJymIBXe3SxsQCLadBqGHLgDe043ZVLC5r0xqQKi7NtUI5aCG7nBhWAi5XY4hhzW2JGloXAxhXV9NcXT9eA7xtsF6x81174UO6g+A6qAqY0hVEs2DBDOaCRJo2802iO21aJ6xpGnvLj9dAU6faFvuWObRGYjCHJ8q5uiY+pZcTNea4RQ3HqwyLxqsMix2StpVYbjS+5iqz0lghYvrDMc24O0tFJ4peYGRqVPLPt23YwbocfrtE72yOpbq6uhlBzAVR1cYGIjKkcamOjdYhyWBJfDdYhiBtvqbFAiWp/TwWT/smUe4tEy+sMW1AG50fjWd848drLPfjRRYFKxV8PheLF3nZj5fTugdi37sBhePjeODQKsiYsShTkAoGA8JwlQ/EllPjwUTaA4kajyVWSsttTSxHWSw+V60BN6UXv707scCwobY+UaM0sVia5gatnfQ28QZHg4XlW7L+lKJqGAvOQXd5sORS01SaiTjIwYhCUEYsHtNydycg6E7jLjsdVdCeAmfb6CE15kfj5R6IOVrBWeSZgfT250Su1u2Y6K27H8xIL72gioLzcwkUomnd/XiV3sHCBOUWJc7Mc4lz9HLiDGpsWKI7PR7zE2k6aD1belb1hOp5OzExuTHReDkkiAf15gZ9WuLYKkLQ2Z11YE6IG+z5qmXQVSpL7ERpYv3LKPn57dLQnXWUTIZvR7BgkrntoQ9N8gxVRLkQKZmHfhRFp0nKi2l9id4dCrAGE011U9OZyoR8N/vgU4NL/HiR82Nu9sHnmOghsTExN/uggTHReI3TzCENjDWHdDnWHFJjWOyQli/x458XJMqdHwvg4ODKJwago1sbDOa6xGC0md6JtO6JKXWMHVJ3bAA5quMJ0q5L1L05APegnOaeGID7wWkPJsrdGSBWbq+wOz9BwdzEoDMTc9BmkMIqlWwWs41OGXlXI7SmEl9mRXCanTrX3WUrONGHo0a84Fyu/xlC29gXAd4FYNgVOQIhb7MPQ3uCqteMkE4mPuqjL5qLGIw8uxhh6wKOTK/9lNqPwGDdPxHb9MW6ZRN85U9pLiZDO+I81AjPfyRt+49A+90IRXUR2jafvnptjzkC3C7+GY5m7i3AbT5s8lRGaefD7/XGkmsM1HHvS30Xs8ufof8fIbguGo1Wy0yEQlVifigyPv8sZqU8ZA66/M4n0d5PyMiKhV82fZtjGkuNy03zMbk9KtU4WaTXmZJdViZYunw48enCmJoshOJbEV60vu0Qsy5Y2RdBAhro58NM5SIQ94vs5FTsaKciQ72IRdRAP8lwRbSwVOvgZKV2bU+kCYMQmChnNQDWcIcwHmq2bFdCJaTB8ddinpt6l5SrFbzhrFzh0e2mR6TZ7lix/Qh92ErYAbvkQkSASz8k/KlRCv36OpuG8HDt3/34rVCWuDT0hsHYRz+blafD+POg2FYTtw11t5/epAeuWP3k7ikVXtrufF7SylF2bgSG7bpPCT8EPY4Cxr5AxDVujOpSegLkmd/K0D1M5DKBTLXM+AUN/942EnyP9sCrloqrkOoWYR3yC4ZcLYWPt1uQHPTuLH3XXyXl+tWrES5t9UcOnvu4ZA9skA47Yw/YGbVmZ9iKztisDkTEE8GkdJCaz97FKR0rxKj93TFAdHMljYNpNwyQQj2Y8c8YA6Vhx/ozOqAQ4rIV06XKdtiqymek8CqWuh7V2x6glZnZXTf4zgjOaYDD3CJ7sbLLuYnVwhYrD1Fu3XUS6zKNNNjInhjdReCvMlGSdEIukfWqFOkka2FLOWI9GMEGVBWhB6DcNnATYquiQji1YbAWc5KN3FfNqJv2fSxF0hAf70PXoxqH6lHEsPms4lZpASfQgCgzG7O8pP3SfjZmS0nvxwL7ovQ+PtZ5nBq4yFTUElmwOPRhcpDD1mH+noH5WJ2qNtCnVyZJWgjqpQLeRJCzDLoClaABcDBXsPWIGLCFtdWIlBBi2+p3jbOmUomvk2KoYbCKVgC/gGRQmllj4KKUYsktV/NipO3VmLejFnIknOrslUKCNXZGqrDLJnlaLCisFlu1SFwzkGzpQZXNCDsjWmewmIzAI+tVqRdmacNAHQpcDOklA4Pn1AK2DvBQKwIKO6P0LCx6lIUMMaKqrsQ4UVUYtOph2I90rgk5Yjn2OU33E0PgVgNVXdlPilQgqa9dILFKJlyLveS+hJK+HPYsWQddjjw2GZl7BWClYp1ablcV/9SCubOQrTdhTtMCMzZIDVWdmWSEQzlqG4pZXvZRDB+0mY7hSmvh9E0+Fk09oMOb+nNaORQ7IChbYs+OFY5J+SDmDo/dfa6kbcGoeg8CPpVm/gK3s2+1xNaxEhnTONDrkGCmz5TErUhOOzP3JmRZ3VCtNGMLkr/WBIKjCFROOvCmWim1IFE80ILlzsbOIu/6+Bw6C4I0+dKe6XctjSLt74hwfgc6vDboB3YjCMmLSWwjF3MyCpj1bcBpDujAwwJ0JQpwMtiFmDQuRZa+FIuJhe2ixbKFZ6utOOcXy2RbgU42tScD5wZu4HRHbgByMYXNWyGx1BslKLzVd0fV5OsRROOn9rx5KPey+1P4dQ5UIaudHguQViGozM7i5I1ZgYBsJiqiOUDjWRD614xAM2AuR+J5MttzOkf9UuxM1aS/qSeAOgf46RkNGJWmITFH6tuv2MvqMyW2FNnzWkS8WwdL7nfrJdiKhf134JlmpGUL0Vi0xBDrOyybih4wavIjC87Vsupo6XIogk38JcxQJNLVCE1QRJoI56oL+rDuX0P2dZX7y3SXjp0F1Siwdhn27gMgrCuwDemORGYzjicdsUFbgy1FC4zcxm0D5jEyGoX1/1fKy76nNrlqtKPeAaWYotRg5bpLMJLdCMcTg1Sfj03Kco7Wu02+KiyUchjOWfahEQcPlpbHVbk0D/WFr1r0ZGvmUnKF0hHfLjVq0xvCDQIMDj31KypnvUMW7USbaZcmS8LPqIh7ocpWcxQNej4dTxvUGBMqon0yUu3I1SBFLsJMpIpVEzH1OIyj1iMDBn5bnVRoxd2zHpMuSCa78i3t6U2BMfupwJML3sTSnMAc/WWQZk5DU3QmBlIjQfiHy7DNxInoTU06A4dMEHzuB3aVgtml9382SkMrJgJ5KHMOBLps5BA7EMQSGa6IGjQ8jHZhKvZpJ2FxPhsCtx0S2a445Jx0q8Gg4XSgoxva1C63xALh/tHolXsA55IbmXawmHeO7JDNO9ovjCxA0sfRQ4+gtk2NqCaqn1JR5WuQrFVY1Cr3Vo3uLeUdEGjp3GhI2rRbLwPZgrzLcBrZ0sUUq+wQ8x6waJKKq1E/h+5mQzpt94WIT+ESqgfppIEBG0t8NUZBJIyfj+abFKjQ0J9RX01lQZiU/aQRg4k0DArUcF5j6uAkLVG/NYaGhcmSlbtPKrWBPO0paXYtnbRALLAG36D1UFVr1xkn3rarz1YlYeVl8TFXPxULZKI1DNxu4bLY8SCiG51Ynmq8QRXZSwG/ol/Z8dHcgwNBSp02cgiYzAj4phG0tAUK7bOj/WKMsf4q8T3YUW1nCbbi4yL3mpwpW4MgYUIHaeQwEDYKb6eQGQ7q7oWt1HG/JIz4boDyeUG56fPRGhm5e70+kBfXPyYNPwqSv+RnP7JP/q6UK8m7/xq4oxQZurVnqtAK2tJJ7sAiBr7CxeAynTLf0cfgL4y6g7QNJhwpl69LcBa46E7IeHq3DV/GUiOVJi6ZUMMsHSD0mEt7S/lX5TyhFRx/iPIgnha2Xgly1vdOBmPQM9YWCRtEzAWcEEIHeknUpQXj9GNxSREwE0+Tuagp4aSHYOew3cCinAXAGsAxBGNMXLI0OpGmff3b8uiSXRELRyBN34V4vvxNWElTwG1ej3lGgeyBre4lsbx/RP/nyP4fZxiOCNdjkjjamfTqYTGddSwQ6MK2qMJUBd1mclQdlgTrwS5X/RJ9We5e6IBCsCywZ/JxAtoDXskH6EsxZcm5S2I7YWMz8PtT8191RdsGb6f2rlu/5cKo6BuEgXFjBdRi07Mq6KxXSkCFcBpUKR+v+69yJsDEqiIwgIlw3BLxdRUBvefHBQkKHgoU8TS7F7uedA41GlaTAsbafTuD2dgdzLMZlKm2Wb/eFosHWHtroBmb04LiYQFUbEUgA5XI3R0xgVnm3kkOvv8HnAYw/5mfGqn6HzDvXEVtJc5wUCi28gz1JDuXIWxFD5jKFbHt2Wiw5G7xO/tTZFsgGUpROB20aYmYbun+Kb5scdWWxJazxQoGChACGiXO3xV2E3tq3DkdT4W67v8O6YGmVqD1f50YIdxiDENiBdBD9RgKFLwEdHbYQNh+rx8IGYoekFgRJvFKEpkiiFhYFNO+IurKhwMc1r8KRLA8DO7GnncDVP88nIU+QmOxAYunLoPjKD8bWUk6LG863Ff2Quy9i2cBHWprshwEObIHK9H+KPUeRuLVQh2LcpUrT8fLDMMg9U8IIO0z4DR2liuaGhEq2n6LDjhrZczxZqbtPJpok8VlNwy3k0FQrAVYvvdHNdMnW4LB6Op3wOhsgMMsb+kHvEsNwofyI6CVt61TV16Aoiu8zZJz1BhoC1NQI6vKfiSUtVBvhEK3xIG7Fi5jTjlh+uN1UTUdKdVgdYGOsjpC4NtNG9UT6xlVgWZDhOc+Lnnt0Frl3imjHA2ZqBdP51v8IDcNvj0XxVqR9QOOoh+0T+5fY/EbSQumYmCai4nyqT3izRwHLzcaEjFDyz2YqIyBtLo656JlhyigwYitt54SQ5/v4XJps8QPLIIKMcPZNgRbr4pzWJFKrPjrUYXX4AmjYqGN+DsVcNZWAIvZ2Ir8iJFkku5OK7xyJ9TJ9zFcNPsyWSMVrZfilZKHgdpe+NzCOj03RZDredXxoIjNJc3uTdc0af3XXVgZOHvl/dSHd3aqov0rAJ33EYXkvQAVgS+JasRtA5p25VDxxLENayGwtsgy2dkVlPzuKU4X4L4Mi5jye6Wn9eiKS2EV1dw3BGuihJr6eQtTW6LrU+LWiyCRsHeWFEuHx9+HQC0b+8+aaznq6F/VQcc6eycaaejMuD/GcHgiQ/xSmBtzVR+/OGKriURduhnZSUocP0oZKnXlUl1ECoZnikxSbuCQ58wxgTlEuqwX8hWcKUKwafPgUZ4/0xSy6yYLr6uMhwMk5mw7NNDP30gzGbxQkLUnFq97b9AAhii4gcDETpoLGCFiMjlnSv85mBDIp+CGtDcZioq0mpYG8GsbMRfYg5Xjftju8lekjb0wbLVIJvdwXdQNki5SYd0a/hZToUeJuiGgaMAr7ZwfkKG9wCX4Di5yA5GrHIGthAYTkN1o2sUZsQ66phcjDCfdfofl1ELYVw3eWWOCNGlOqOKPIXWn7wQt4mBl8hFzlmOqlHeSjHYPQJ/zGMODX04W/GLSsPVJ4jSH2oBeZO4lbhnwWAI41KiC01P1TxP48FfrjCFK6nsADCFUcmvegIjKRWafjcWrBvqZi8i9HEFjNiZhmABJwPJdFQ/0U22DtIgWlmoyp+cQTLRX+b1rB4FG0E5Qx5Zf+BvtvHSgnWAMMiRzYFyCKbZjPvThVqTkjVjkJh8JvlT3db55xkAQyWYCKAq1KKv/mx8nd2wp58GJjPWid9+J1EBbqN+uBi04115aNZlIsVzPGKXWqy8lS90oKJfew8EY5LskICJ1jCSanIvBIpgTFyEsrUNb0AFGC111SVyboooU912kJJdqIasSqR2Ws+FFvP6glmY4lbog+UgNaDD1qGBQJHI7qLfweHjM92A/xy1OKA3GLZJe+yKAGYdYpS/4bRz2P337u4KqPrj0MrUoQsa1AgGeBvIpyPK227CrqEB9B8Xgggr8GBJp+iiAybqdK/xwmLUPoZ2Fjwq5NnHXcm2aIdwhGvRCQksGn1Lx4RDaI2mE5qLxNnn0JEiLJfpW/kzdrIs5heUQ28qhZy9l8WQxUh1Zqz25jnUIMhi9KOBJz4hwLhfee9AgY/85yLfNIYM8/Chp70PQ8Oef/eayxNdGabzEsqCHuiMWyBdkuKmyZUk4jE4NY7O57EvhCC9/gPHUQz+2gFDbrx7WR7izWRKOC+/WnCBQ0/zVtdGSVPWw5CKDfFYvzHrkQvvzjDOBdy9r2G5cFZdSUNh8jO6mIWfiyReUAXKlpuFU+wVy8WJMGZdCGPRDoL32vlhclXe+DNaAUy3Wly52Ppe0s4J5jnZa0/Ee5PDtkDeov0TxcTF9iQSJph9IW3PweWyeHtPXOHioRd9EyVYlBBJaNbVLUjcv9EaqgPQe8uMxmHf00oHSU7WQt5m4+lNVouoMg3osDSFcG9RqvFFhWsGwCEoNx/Wfl6hqmcd3zPN+IhZ1s3ZCTlZCVR26OmbQJolhK25GDefC1KdzWj/NDKIfK3MIY4aZm7Vc/Lz8YJtvIu1cSOVXEOH8YSMip2fwZ31hPgZwunH6jIn60Kphc+3H6ofznu9CWRIE+/XohgRlSVPPvCiJF4+hfiUGfpkwesrJwCvqp8lUE3sXi5LhOwZCP23lt0zhFLQQ71LmFLinE3+CwdPiWpE6rlntAJcHfSFIO3X2KXA4kuG7FnPAKEd0BZznsCcnoJK9G07orRRp/8zvJPbJvfD1rw/SKNZtd96l+dL2WVgsnXC2NHYXazuhA8P5E6Z072zk2jkLe5YPZsnw7oSHOA1HWRoyx93BbtK8RLlE7kafcqrwGHbOQCn0AUpX19AaMMRd70nOLPy07WuQ9R8gDF6NZ12rp5Xfw1bxTgjZ96L0hjhr/DTFMA9LzdXHSM6OKwyHeQpCvf7s93j8MvugYxmPprh/Cp5lV4OJ+1k/2Xq3CukcaGvbXY1l4EbUSdVQizsRIexvBzH05E0+di9lnNR0E407huFo3oSYFHN/2wSXlo3SuxmBaZhtTZ+tXovXoHv6I6NQt3/1+E/6IaYvj5Cf9KUiwuOm4zXUXj1mU3jCoQB/nWTMj7PQUXioJ9LwTlLj0aOBvUwmOPI2JRYvl8Sxq4D6EALNLugceKBGn9DAyhK89Ssk9IzZqqnU13qwAa/D+l+hvi6mpV47FUNGNRxX2q0OX6eqZgwZq3oiiFaj8NAAH3/oqBqgCz4efwwWlCFYLOcsV4vem7eTnFN4EPODRlfHHSncgwQotlxMH8+pReha85x62y38C8OpXMkRbFRpgBqcg+yqP0rE8Iz7F2qof4xW52D1SnAiJOXUe+s9v03wjdemJdebmsSm8iYUqkUTHsskPngNa8y0j4CsNHAjWkjb7EtbNYvkeq9Zrne5l5BAR603MRBNC0Qht/euxu2gee5cIGon7DbOnxIY/ezQMDPk0k0E2TvppuVj2KBKQ2kad1km0spldaiRKpru/EhJp4Vi9cBKsRZPCPsU8jH1ibgSwY66PtJkScKm4WruZYX/saiqxuLFIrH4ZP5LdrLL9kJtQJQfbUOmPBXXrIuw1HgRWffDZ0OOSlkZ/nMchyjOMNPOl6xLdmPk+sgohunqLoKpfwGrtIux1RxdHk3U3YXtsY9GZAHO6wUXQcUMneg3LOd1DWQ8OxFp7cRGbDPPPBHg+OzSTPs74gFppiUGi+3RTRBoXU2jqQ5uUWoKVO+S+OPVLK8pSC7YWFugSyHdlg3gut7HzasGvSqPqroMtvMqcOJZz3HmPH26aGf83krZyTF2D4wpc+QeEwMEVPkhJeXMPom+5qy3YKUzlVBh81A5OuVu7mpn9w3+aIdCWAP97IL+ZovLkNhaxqQBaXbL1ZqmLnqw+Y5GaACaGCcxRv+0JM45FQlVJaSdPiy0j9GriXJZN/UHOahVgkRPOhg3BBlRBzfaQGGqJszMiDaZJyzTHHWqbUbdp85BejRlJCXq5UpPoMh2KLm38GpTl0TQLp4RT/ODIu1ejWm1hDP/oaoh9/nEQYqjhNQFUD9IpXQgVhjEIhU1Z8QhYIWDD6kYojlfFTqFqqT7b8eyNFBUpf1mfqTG2l7/DT24cTmdUcN/KSGnPBSpWTI+7VBE4geIhPkcikgIQCRLQg0zNbvwoJnToaAkWZOUhgIdmfRcUxCynq7G73QR9qK73T83HuhnIs3kQNvlzY0H+vkbaYm6xYE2VBBm9GB3bjNpRcw2f3uCsp3Yk9dhtFKDeW0z15Ga6egzYktxAioGUGNcQWlYHr2Pv576uOgNo86WtXoc1aVPeEITwnCDDBPSEzk1Hguh+/PgGE9Fv6yOtsd9GL0HtbL0vg6zrDSU0439/MBXqwZbXzfKTzjObWCVRrVj7OojyXN3tmqhBE0lfOKtn7LUOE8704VDMAeRIE4L9l88sLeLI6YWGk04XnK7Ocst9bgLL0rEvg8y1EdP/WFNkrrzKu7D7v5itCHYFpkxQnXYlfguhqDWVEqLVMNWsVwNiM5qh3FMeUPRHH47dB1yYF5PEdpDuCyT3F5yUlkCFRDr+49apHFnUMRW3xUUsW9DrvfjYc275/kB0f0ex/rXThJUoT7WFwbr82JOeOAsU8kwyShkqjBgUKq2HoMmFU6RYcYARxFe8LvpepYexe6xyABW9lbOuwOC3SOwx5iAqPxKVA/HrZeg8/YYrjyStSuw49JSnTGG4o01YnJ7XyRsqhe5AXpwXWtu1DGurhyzF+EkpEGyuOBc1m4Ik3NheX/kDTi7TchS+0lfuMKdcAnSIKQIfsRmCA9ImCE4kQ2BXZ7wAN9XLmCg8BWm8kYIYe24fY7ywyrM2uT3pgnhHQiCJuw7V+r7a7z76HVMPeiO74SWoj8QfQR63SuR2w74s2QcwyD8E7ntb+B6Pxu59Lm4WE1sDenSaYEcx7wpdLwWAX0jD5T8hKajCdnOBpybVLC3GiK/DHsOPJLt+uncj999DXX2GXKWHki8NmLKNFjf/uzdkltQkVEG3XUCZFXjm4kL7z6MWJPRMkMvmgIeQiljdVN4gbLpUclNxYpMGcmUsCscjttrbYAhyeId0wwscopgWiJAq+pFMniLIwUJZwr6RXXbTXvMd8+t6KN0tlKfQoRWrBwZVQmBDLbdZfRw4U1RIfzNYRjRJvG8Gj4qSoYYHoyxOzEpLIJIXIXOJYSGR3JlHb48hXAB7FgpJ41njexHH0fjpCs4mycHbSOalRSc/5q30uUobCDrZsM76ZN5avqbjO4yFe93D8llKmecp/5MK+T/Bbhd6LOsLTuqZnMqYQ5yhIarGRYi/kp4CX04suLhaGCdubdM7YsegZKpRBtye2c2v3qSywuebqhimHvrlBDfibFYOWuaJ+yaacMLdOhJTD+c/PXxv95rEeqXb/JDgbhup5pwY5q5G42YvqW5K4m5zsJ65i/16k6FMCGtGzCAE3s6DEkN3g/qJf8V3go4ZtqFmOFUImf+GvW9fVNfmHwb7WIRb8Yu4JnebghAlTXn1TfbgFVOPWcUrsrpTXkfyX6DKefJPI+zQboyZ61i5498EypmHD5UakM5CAVKNx7fMdnC4tk1r6puhZdQivBVS+Ohhv4IoVRalLZMmqtHkJ6G0OaH0lgg796CaHIXugvstgKncvC5eic6wpG7IJdLQt9N7Aqoq0dkGmZmNXgIpF0TczF9MtSux8+9Dt/2fXrf9aI9KDJ9QasZ2yl98TL5dh4ac1K4S3iooS8c5Hkg0v44/1xagvnRGLQ9l3AHfALanTQcFvkVbGl2fwje25Wvamp0cLzYJGPQx0mqjuOg9YhiMmrUuC8cdCXAK3B8LHfv19i1Y+Bh501DuvzZFKifeRC9X8MRfg1ozpsW69DQLkS69D8cDuFrhEnHRmEh7rsDmobWnKXIcDbt2NshPVWQe1apH5c08spcIEWG5Co/SaEX9arp9ynX2/FDeWlW1XhK9VapLBDNpb7/qp9BGuTWx4u5AjRfSXRVyGltlZrrJ3awyM1kONPRKo09lcM0JRsfuQpEFFUQLBk80Jg1VYNo8BlPo2YFMoBEltZxJzbRRCJNPc5PWCyNHoEgry2e0foii/pmHimkihl3s157v2M7D+dt4hPAz1dwS56wgAtvFLq7mXs4giEOWR2vRqfB7NaeyDbN+ZiJ154YZLlAP2v1xFJS64T0XZ2zjmdZaUmzXKBZ9m9oG45fhRqk9+2UwlroUIfH//SqVNfJ5ffFftOr8rfcKWUMuxCY/OERphRQ3uZgyrxZSeM4VW0OpqqbHRnsCOpW5hDO/AAp75jyBGdu7QfYec06Wx0VUVx98whnY8VTxhGNLljxJNrXN88DGnjHztGTnXmPqtdklu6MIYgkeiFo7QzZpUGvqwD87p8ikkhkBQ0+hVunMyRdrkYgoNhaDkIabvZ1IOhwW9XFOv8RCJisCsNbaVwEJg1OjFf+bM3dAkwv3mrN7WDJgUi3egHNfW5HIH4tVoSnl4MMohuNfHeRtW3GTtNE1jLVdfglbMF5XAP5lLVsHsVaruOMtDs2yMegXtbS+yIaVFVWzvkitwUtt7ke5CulZNCrQ3ibqQ2+3YZaqg1U8hqaUY20Xiz2lUeRSah4BsQXPGfN+8SN2D404c3e0BQNni+p4yVPdUIQgClRewJCqAIeBbQbMvhWrdI+TD9V1bSP548asX3bB9Ud4e0afTi2gKtMX9uNNHHltvgjF0iLd2OBIDoJBWjFGUqrKP+NzYIKvOrl+nBm9ZrWpEplrEJwkXe+18o7NIHHlA5rXuXH2Wbsoep3M9Ad+jyYOhGoZfoO9flD5abXZpleoJiPl50ZdS9n2zJ0B50wa1LjnA7OKyimr7oGJmwmG0WcmhOlf8EQ8SaHd7LlXjQwHKvHaaMZiznsEvWRafeCnD6C6x4R30yf0P5qaNAMVeHmfTlzxExPPd94QNH5I9bpYzga4zgrfaeHXb0r664MVjtIwy+m7mlF7NuOYzO3q/kw1Ni2o4IJ2IouwWbZGp4xScVgVR/4VSuV5k+D25nnyXm5TLbXw/4iFR19Jk+5DEcbrw/IDef5vkzePRuunCLPEqXSFA4AqgTUZ0zkxo45ctaZYKtFtj5PHQJSktqxwiEQV5Iq1lg+qDGe30bkeJeG0/VYc0hvcgdcYAx3f9ViREIx6/z81LcaT0/nmaEux/p2vkJl2uWq0FGDHX3avxl9tvd0zJFQTplUh5qc16SV17LNGAs1XKqWlaXI1o5E4NznRmluBP4M74Dsj9rgc60czeWh+ccxyalDXEzwxPUs7CV/Adnr67i8imY6ovykJXdHD/8zNNUNcBXPQsEObhnE7HM85jQHf8tFEO1P3orOzq68OY7adjxuHL6wm6bQxiDG2fsMmKf9j0hLObCeDexe7uusgBDIUupo7KqO1McoMKU9HMJbrbCZgd3yjkFTKhV/5EXK1fpYF3zOshnY6FZ8C4TxYqaK4Z3eJXkzRxucaT/h3ZMBY0B55foqNKPXoHyumt18CelUwWtAaWhJyeIHFAR4P2+CVFY3n3IUnG15FFRHn3OTiv8G44xZCMHWHr54wGqui25fc13kobLhsQ9e4QugI/905uxmnq/6qUe1LakaGsrrJJ6aaNePgKTbAMTw+pxdspYR8k0g4/ojnkASpKoPd9yRuxxFaRjVPS+vBjEU5tlhAJdvAhn23ayyBILlc/UJD1Bmmzw1GUPNXgYAk0MMcxt0J2X6Ukkp6zIN7DUNE2KtqllYipXE2yuil8mC6glSg0f0Oqrkewg8ZHxu0tZylGMSFAaDDWOjL1MpScyNUndiQi9BqhucC7btpVQZeFKH4eoz7fIaFqSmPnZggf7LKnXsboLhyMBKDoxUVykWX6UwF3SYZ2tNdk40vsD6xPRyuIB7kg7sGK7KB+/Y8qiOPxoff3xWOhbzGzvmJ3ZMe83ghNzDS6syoEN3zK242wH/v+/4oeMPH7RSB9Y/Wnjo+un6QzJJYnz8DuICOPiN9VcwyEXVDjAdGKmMPwqvEL0tvn+ufLx+VBOll2e5EJ99FcIlWDsKLOFW14Nw4Ej8tx1ze8GO5R6Ycbo5AFvhQBaDcFMIqCvwKbvu/kPlnGPeN7b5i/6+PgZUjzS6nGC/PpF/Odv5DaR9TwQu60b5uOL5qZRtwu2picPShIeTN1YfOGsCA6uPOqI1jGAlhuNIBm5xZTgdDeVFN2l3MYYQ+S1dazW4WOqvmKgzv/KXdmjM/fCEs5lIviWmPwCwAl3n6btjqVhCzeRC4wquGOyjSVF2ezyK1znQFUNAHkt4rvPIAmzvP8AQ8jIG/dnRUvOoDD/ytvUu4622EzdzLGtRtzZexApwzzfCQVWp3oRONqhDIraZdVijtdSXCT6WJvMmgwSmgQFPw2dIegtF5gihjTb2SnjKz3dA7tsUKKVm7B+UAFPP06al0XDkh+C9t428rrk/TWJfIcb5DJPmX2cCMEs4Fj2xhf5Doz6A8BMXdyfuzfk8MXcOPzvhQc8Uw3DrazudoP+yXgLnXiFBxiblv9VcrMsbvvUu4kHHLh/AdfflhxK6yPXjXYQWUhKT5TbjFSce2LfmRtaz/TXAW/FWsBJGzp0RE+FzZLrwEqlcqGEbvCV6y/3I3C7E6FsD5Y1v4YZVZ/ARvN5Yij//0GJp4xfOeA/egf2Fg9QDvLGYV+wRpNmvbvYDHqPkFpDNS9BqGqhNV4leOiDA1Vhn8ZNDdg3iILW03qDvD5yF7fPPbUBdn2KHuBfBLJ5xPK/krDlN2mvooPbyQHTbJj8wDe6I3aMyLZ0gtdQR/mLY2wks+oRlEruYt7hNP0zDlaTog68VT0GaTn2kmfWQJp36RINY/tEyvGVKMTHkH3EQ1Wm8AA3yDjU0eKGbEpVCR2MQcDOAs0l/ywE5xTasRnNBymYR8plLa5X/QJ6Pm4FtxDzKw8aiHpMqXn1zP++gse2ozXnf0v1Ui6dG04dFicXrGl6RV4ikAU1zP7BStd4Ev0nD7w25Ii5GEeTwTjSjhnL/1u/eeuPoALsLOWG+vnTLy+smhyeTqy6LYgVpAnF+6nFB084Ukjeo3U+j6Bt2SZhMK6XrAoTpPGTuMpJbGcf46C/rOLpa/S/0pX/3woSLsQ9tghqygH4wVLeUxKrQ27aBBlNb0YyZ6vXwDjhtggmeqWrGeExt79QUWQdtuG0blcDlmmlUVwdZrhL341Lag66/W1fV1GisnJemK0ZQfFuzC4FlkOP2rfFF1YZdjO3qjMXj4lfiKO/XduCjLN5i1Dd8+U0d9+5ZCF05Zsvqi618n9OQqtQP9wzjgfvxInHYREm+zGOigYNXFnyFi13EjZMBydnMs/VJI0w4p6SmwP3PXxKPRU6pOaNmZmFkRkNBKPJgTUFaZFyNxAY0zCySLPkcUFNA1riamQ0FhZGuNQV8p0XubSxIIZ4WeZDPGQ1kB5nInC7E3GchwHXhHAMjcCpmLUsR1F/8ePSQF9K+QTZ542qEMepy7d5FhfxrUtP8pvVsi+r6v+M5zvdRfrzyJIu/9UhlbvEICsMJluLCiIGN+80TfYszGT88fToluUZ1DKngPt4ddSxWLpqobH7zonSaCVyF9F11fnkKYxcegeZST0YRYREeJ2PDq6/AJB/GMqeoPiAFrY0+IY5vuPGQmvzKJqmOogyPugjkmGn5nfq4PK9+d7OAEnwZQo+bwAMvrBam+DqX87ND6PFsDU4jLRA9mDx99BIjI/d0WRgdTYq62KIRaaWPTQseM11xSNsNW3YYaFTpAX10WxUpbnHUtyJZh9UW1+EiDL5UQSKf3Og5XSmRhZCjnhshjGd7NZxC5uD4uVXlWwr2euoUrQq+Rsi5yvsNekPpvBo1Kw/P2Tok6ukIr5U9Tr8tjjRUX5m8ww+Yd/y8hG/xg5/RqlaJQJ6q8NQw90TMfoOATyx65VNoqSkjXFTuyFX6dmAusEVRe7kM3L47Ihay3rRvXCOCmi+HlX6XWk8jcnZPpmw/U+6j5ijo4d0RUSlfhVzuctxptp8CQm89O15r+3nUevohP94gqS5LvtNy5LQJxC8Q4snr1l99+vTlmNnsAnSfe3JF71F8i/XXHpzps4peCg9KC15fcudjOi+mjdwFmYrzW+DSxg67d4U0xuo360vR+tRwWRwPNqtmp2GGhqgb+Nk6nM30J+qkn0/RLj/OVX3627GGdtLJA4g2X3wrxgMv9yKuuA5J2jd9lH/j5qtZxOzO5RL9aZMaJcKB8+qCSdeT0Eqx0n7gf9VA2YVmdYbqom8tPrI+qj8uk+pA1UnbmnkqQZ9rax6lV24Dhmrud+dUqf4I4tXMeTGILn0WQn+gT3/jLRVwa4rQ2eRXjf6CVKr7lUPb/FFweng7TKEYWE8bwOGFbVcnIeFAhItuuBTLPn10J/F0m42/FRUN59TOLCgpfDorY2XGMzOfeGzGzBl/+9tjr7+YlfVW5jMznn7sL0/MeHLG48+8mpXdzvSJgEM8c7p5xcv/L2+6cHTcmy7IuHgKxgWkuSCR5oq4N2JeinXI/K33t13gnk3WB5QT7yn/P7yxnPn/XxBOVug3he6Z/wc6K4ayAAAAeJxjYGBgZACCS9IZNmD65+4+GA0ARvgHuwAAAHicY2BhYmCcwMDKwMDow5jGwMDgDqW/MkgytDAwMDGwcjLAgQCCyRCQ5prC0PCR8Zsy44H/Bxj0GKcyqAKFGeEKFICQEQAJOQuTAAB4nN3OPQ7CMAwF4OcWaJMmaSRUJFCHqEjcjRtxkF4MEzywtOZ3hZknWfaTvsEASjynB+GeURs9+gIn3QOSXsWZuOSKDW858SHHvM5dPl43YiRKL/tpAtSAl2qimuFjOsHbtAhFoAB/89lfnHW1q5qxMTbZnW2tef3wJbTCb/CPMwM4ACwLAAAAeJxjYGRgYADi0OesrfH8Nl8ZuJkYQODSz919cFr0/23GV4xTgVwOBrA0AFr7DRcAeJxjYGRgYJz6/zaDHhMDCDC+YmBkQAVMAF+2A5AAAAB4nGNiYGBgYmDQAkN9BgcwDSJ9GBQYlMBsiJgolNZi0AbiLLg6ECnF4AhWB+H3AlVAeA4AdyMJHQAAUAAALQAAeJyNkD1qw0AQRt/KkiHGmKRzE9jSxEistjDYuFadyr0xQgiEFiSfI0dJm3PkAj5LRtIE3Bi8MMybH775WGDFN4b/FykblrwrRyTslGds+FKOZedXOeHVoDxnabayaeIXVZ3YsBaaOGLBh/KMT47Ksez8KCdYbspz1uZtkOoJXKg505BKBCqJXgbhUp+btAlVkOpuoJ1CqpbrmDuZlaLuyXCSDxKPhKepZy9dP4Yjl/+gCO21CF1VWp85e7D3BqT0+9Sn3uW7pz2fxFMn7Xp0auXOcCkb8+CSU9n1dWitc3nmnLPPKv8Br9RH5wB4nGNgZgCD/wcYJIEUIwMaAAArwwHdAAA=") format("woff"),url(social-logos.ttf?51b607ee5b5cb2a0e4517176475a424c) format("truetype");font-weight:400;font-style:normal}.social-logo{font-family:social-logos;display:inline-block;vertical-align:middle;line-height:1;font-weight:400;font-style:normal;speak:none;text-decoration:inherit;text-transform:none;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.social-logo__amazon:before{content:"\f600"}.social-logo__behance:before{content:"\f101"}.social-logo__blogger-alt:before{content:"\f601"}.social-logo__blogger:before{content:"\f602"}.social-logo__codepen:before{content:"\f216"}.social-logo__dribbble:before{content:"\f201"}.social-logo__dropbox:before{content:"\f225"}.social-logo__eventbrite:before{content:"\f603"}.social-logo__facebook:before{content:"\f203"}.social-logo__feed:before{content:"\f413"}.social-logo__flickr:before{content:"\f211"}.social-logo__foursquare:before{content:"\f226"}.social-logo__ghost:before{content:"\f61c"}.social-logo__github:before{content:"\f200"}.social-logo__google-plus-alt:before{content:"\f218"}.social-logo__google-plus:before{content:"\f206"}.social-logo__instagram:before{content:"\f215"}.social-logo__linkedin:before{content:"\f207"}.social-logo__mail:before{content:"\f410"}.social-logo__medium:before{content:"\f623"}.social-logo__path-alt:before{content:"\f604"}.social-logo__path:before{content:"\f219"}.social-logo__pinterest-alt:before{content:"\f210"}.social-logo__pinterest:before{content:"\f209"}.social-logo__pocket:before{content:"\f224"}.social-logo__polldaddy:before{content:"\f217"}.social-logo__print:before{content:"\f469"}.social-logo__reddit:before{content:"\f222"}.social-logo__share:before{content:"\f415"}.social-logo__skype:before{content:"\f220"}.social-logo__spotify:before{content:"\f515"}.social-logo__squarespace:before{content:"\f605"}.social-logo__stumbleupon:before{content:"\f223"}.social-logo__telegram:before{content:"\f606"}.social-logo__tumblr-alt:before{content:"\f607"}.social-logo__tumblr:before{content:"\f214"}.social-logo__twitch:before{content:"\f516"}.social-logo__twitter-alt:before{content:"\f202"}.social-logo__twitter:before{content:"\f610"}.social-logo__vimeo:before{content:"\f212"}.social-logo__whatsapp:before{content:"\f608"}.social-logo__wordpress:before{content:"\f205"}.social-logo__xanga:before{content:"\f609"}.social-logo__youtube:before{content:"\f213"}
diff --git a/wp-content/plugins/jetpack/_inc/social-logos/social-logos.ttf b/wp-content/plugins/jetpack/_inc/social-logos/social-logos.ttf
new file mode 100644
index 000000000..9b7f5289e
Binary files /dev/null and b/wp-content/plugins/jetpack/_inc/social-logos/social-logos.ttf differ
diff --git a/wp-content/plugins/jetpack/_inc/social-logos/social-logos.woff b/wp-content/plugins/jetpack/_inc/social-logos/social-logos.woff
new file mode 100644
index 000000000..cbb3616e7
Binary files /dev/null and b/wp-content/plugins/jetpack/_inc/social-logos/social-logos.woff differ
diff --git a/wp-content/plugins/jetpack/_inc/social-logos/social-logos.woff2 b/wp-content/plugins/jetpack/_inc/social-logos/social-logos.woff2
new file mode 100644
index 000000000..51f2a4f9d
Binary files /dev/null and b/wp-content/plugins/jetpack/_inc/social-logos/social-logos.woff2 differ
diff --git a/wp-content/plugins/jetpack/_inc/spin.js b/wp-content/plugins/jetpack/_inc/spin.js
new file mode 100644
index 000000000..c66c607a7
--- /dev/null
+++ b/wp-content/plugins/jetpack/_inc/spin.js
@@ -0,0 +1,349 @@
+//fgnass.github.com/spin.js#v1.3
+
+/**
+ * Copyright (c) 2011-2013 Felix Gnass
+ * Licensed under the MIT license
+ */
+(function(root, factory) {
+
+ /* CommonJS */
+ if (typeof exports == 'object') module.exports = factory()
+
+ /* AMD module */
+ else if (typeof define == 'function' && define.amd) define(factory)
+
+ /* Browser global */
+ else root.Spinner = factory()
+}
+(this, function() {
+ "use strict";
+
+ var prefixes = ['webkit', 'Moz', 'ms', 'O'] /* Vendor prefixes */
+ , animations = {} /* Animation rules keyed by their name */
+ , useCssAnimations /* Whether to use CSS animations or setTimeout */
+
+ /**
+ * Utility function to create elements. If no tag name is given,
+ * a DIV is created. Optionally properties can be passed.
+ */
+ function createEl(tag, prop) {
+ var el = document.createElement(tag || 'div')
+ , n
+
+ for(n in prop) el[n] = prop[n]
+ return el
+ }
+
+ /**
+ * Appends children and returns the parent.
+ */
+ function ins(parent /* child1, child2, ...*/) {
+ for (var i=1, n=arguments.length; i> 1) : parseInt(o.left, 10) + mid) + 'px',
+ top: (o.top == 'auto' ? tp.y-ep.y + (target.offsetHeight >> 1) : parseInt(o.top, 10) + mid) + 'px'
+ })
+ }
+
+ el.setAttribute('role', 'progressbar')
+ self.lines(el, self.opts)
+
+ if (!useCssAnimations) {
+ // No CSS animation support, use setTimeout() instead
+ var i = 0
+ , start = (o.lines - 1) * (1 - o.direction) / 2
+ , alpha
+ , fps = o.fps
+ , f = fps/o.speed
+ , ostep = (1-o.opacity) / (f*o.trail / 100)
+ , astep = f/o.lines
+
+ ;(function anim() {
+ i++;
+ for (var j = 0; j < o.lines; j++) {
+ alpha = Math.max(1 - (i + (o.lines - j) * astep) % f * ostep, o.opacity)
+
+ self.opacity(el, j * o.direction + start, alpha, o)
+ }
+ self.timeout = self.el && setTimeout(anim, ~~(1000/fps))
+ })()
+ }
+ return self
+ },
+
+ /**
+ * Stops and removes the Spinner.
+ */
+ stop: function() {
+ var el = this.el
+ if (el) {
+ clearTimeout(this.timeout)
+ if (el.parentNode) el.parentNode.removeChild(el)
+ this.el = undefined
+ }
+ return this
+ },
+
+ /**
+ * Internal method that draws the individual lines. Will be overwritten
+ * in VML fallback mode below.
+ */
+ lines: function(el, o) {
+ var i = 0
+ , start = (o.lines - 1) * (1 - o.direction) / 2
+ , seg
+
+ function fill(color, shadow) {
+ return css(createEl(), {
+ position: 'absolute',
+ width: (o.length+o.width) + 'px',
+ height: o.width + 'px',
+ background: color,
+ boxShadow: shadow,
+ transformOrigin: 'left',
+ transform: 'rotate(' + ~~(360/o.lines*i+o.rotate) + 'deg) translate(' + o.radius+'px' +',0)',
+ borderRadius: (o.corners * o.width>>1) + 'px'
+ })
+ }
+
+ for (; i < o.lines; i++) {
+ seg = css(createEl(), {
+ position: 'absolute',
+ top: 1+~(o.width/2) + 'px',
+ transform: o.hwaccel ? 'translate3d(0,0,0)' : '',
+ opacity: o.opacity,
+ animation: useCssAnimations && addAnimation(o.opacity, o.trail, start + i * o.direction, o.lines) + ' ' + 1/o.speed + 's linear infinite'
+ })
+
+ if (o.shadow) ins(seg, css(fill('#000', '0 0 4px ' + '#000'), {top: 2+'px'}))
+
+ ins(el, ins(seg, fill(o.color, '0 0 1px rgba(0,0,0,.1)')))
+ }
+ return el
+ },
+
+ /**
+ * Internal method that adjusts the opacity of a single line.
+ * Will be overwritten in VML fallback mode below.
+ */
+ opacity: function(el, i, val) {
+ if (i < el.childNodes.length) el.childNodes[i].style.opacity = val
+ }
+
+ })
+
+
+ function initVML() {
+
+ /* Utility function to create a VML tag */
+ function vml(tag, attr) {
+ return createEl('<' + tag + ' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">', attr)
+ }
+
+ // No CSS transforms but VML support, add a CSS rule for VML elements:
+ sheet.addRule('.spin-vml', 'behavior:url(#default#VML)')
+
+ Spinner.prototype.lines = function(el, o) {
+ var r = o.length+o.width
+ , s = 2*r
+
+ function grp() {
+ return css(
+ vml('group', {
+ coordsize: s + ' ' + s,
+ coordorigin: -r + ' ' + -r
+ }),
+ { width: s, height: s }
+ )
+ }
+
+ var margin = -(o.width+o.length)*2 + 'px'
+ , g = css(grp(), {position: 'absolute', top: margin, left: margin})
+ , i
+
+ function seg(i, dx, filter) {
+ ins(g,
+ ins(css(grp(), {rotation: 360 / o.lines * i + 'deg', left: ~~dx}),
+ ins(css(vml('roundrect', {arcsize: o.corners}), {
+ width: r,
+ height: o.width,
+ left: o.radius,
+ top: -o.width>>1,
+ filter: filter
+ }),
+ vml('fill', {color: o.color, opacity: o.opacity}),
+ vml('stroke', {opacity: 0}) // transparent stroke to fix color bleeding upon opacity change
+ )
+ )
+ )
+ }
+
+ if (o.shadow)
+ for (i = 1; i <= o.lines; i++)
+ seg(i, -2, 'progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)')
+
+ for (i = 1; i <= o.lines; i++) seg(i)
+ return ins(el, g)
+ }
+
+ Spinner.prototype.opacity = function(el, i, val, o) {
+ var c = el.firstChild
+ o = o.shadow && o.lines || 0
+ if (c && i+o < c.childNodes.length) {
+ c = c.childNodes[i+o]; c = c && c.firstChild; c = c && c.firstChild
+ if (c) c.opacity = val
+ }
+ }
+ }
+
+ var probe = css(createEl('group'), {behavior: 'url(#default#VML)'})
+
+ if (!vendor(probe, 'transform') && probe.adj) initVML()
+ else useCssAnimations = vendor(probe, 'animation')
+
+ return Spinner
+
+}));
diff --git a/wp-content/plugins/jetpack/_inc/twitter-timeline.js b/wp-content/plugins/jetpack/_inc/twitter-timeline.js
new file mode 100644
index 000000000..16cd6dd7e
--- /dev/null
+++ b/wp-content/plugins/jetpack/_inc/twitter-timeline.js
@@ -0,0 +1,11 @@
+! ( function( d, s, id ) {
+ var js,
+ fjs = d.getElementsByTagName( s )[ 0 ],
+ p = /^http:/.test( d.location ) ? 'http' : 'https';
+ if ( ! d.getElementById( id ) ) {
+ js = d.createElement( s );
+ js.id = id;
+ js.src = p + '://platform.twitter.com/widgets.js';
+ fjs.parentNode.insertBefore( js, fjs );
+ }
+} )( document, 'script', 'twitter-wjs' );
diff --git a/wp-content/plugins/jetpack/bin/build-asset-cdn-json.php b/wp-content/plugins/jetpack/bin/build-asset-cdn-json.php
new file mode 100644
index 000000000..cc173480c
--- /dev/null
+++ b/wp-content/plugins/jetpack/bin/build-asset-cdn-json.php
@@ -0,0 +1,49 @@
+ $value ) {
+ $path_from_repo_root = str_replace( $path, '', $path_to_file );
+
+ // Ignore top-level files.
+ if ( false === strpos( $path_from_repo_root, '/' ) ) {
+ continue;
+ }
+
+ // Ignore explicit ignore list.
+ foreach ( $ignore_paths as $ignore_path ) {
+ if ( 0 === strpos( $path_from_repo_root, $ignore_path ) ) {
+ continue 2;
+ }
+ }
+
+ $manifest[] = $path_from_repo_root;
+}
+
+$export = var_export( $manifest, true );
+
+file_put_contents( $path . 'modules/photon-cdn/jetpack-manifest.php', "/dev/null 2>&1
+
+# cancel the partner plan
+wp $GLOBAL_ARGS jetpack partner_cancel "$ACCESS_TOKEN_JSON" $ADDITIONAL_ARGS
diff --git a/wp-content/plugins/jetpack/bin/partner-provision.sh b/wp-content/plugins/jetpack/bin/partner-provision.sh
new file mode 100644
index 000000000..bbfcff6fc
--- /dev/null
+++ b/wp-content/plugins/jetpack/bin/partner-provision.sh
@@ -0,0 +1,253 @@
+#!/usr/bin/env sh
+
+# accepts: partner client ID and secret key, and some site info
+# executes wp-cli command to provision Jetpack site for given partner
+
+usage () {
+ echo 'Usage: partner-provision.sh \
+ --partner_id=partner_id \
+ --partner_secret=partner_secret \
+ --user=wp_user_id \
+ [--wp-cli-path=/usr/local/bin/wp]
+ [--plan=plan_name] \
+ [--onboarding=1] \
+ [--wpcom_user_id=1234] \
+ [--wpcom_user_email=wpcom_user_email] \
+ [--url=http://example.com] \
+ [--force_connect=1] \
+ [--force_register=1] \
+ [--allow-root] \
+ [--partner-tracking-id=1] \
+ [--ssh-host=example.com] \
+ [--ssh-user=user_name] \
+ [--ssh-pass=user_pass] \
+ [--ssh-private-key=/path/to/private_key] \
+ [--ssh-port=22] '
+}
+
+# Note: this script should always be designed to keep wp-cli OPTIONAL
+# so that it can be run outside of the WordPress installation.
+WP_CLI_COMMAND="wp"
+WP_CLI_ARGS=""
+
+# Default API host that can be overridden.
+if [ -z "$JETPACK_START_API_HOST" ]; then
+ JETPACK_START_API_HOST='public-api.wordpress.com'
+fi
+
+PROVISION_REQUEST_ARGS=""
+PROVISION_REQUEST_URL="https://$JETPACK_START_API_HOST/rest/v1.3/jpphp/provision"
+
+for i in "$@"; do
+ case $i in
+ -c=* | --partner_id=* )
+ CLIENT_ID="${i#*=}"
+ shift
+ ;;
+ -s=* | --partner_secret=* )
+ CLIENT_SECRET="${i#*=}"
+ shift
+ ;;
+ -i=* | --user_id=* | --user=* )
+ WP_USER="${i#*=}"
+ WP_CLI_ARGS="$WP_CLI_ARGS --user=${i#*=}"
+ PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form local_user=${i#*=}"
+ shift
+ ;;
+ -w=* | --wpcom_user_id=* )
+ WPCOM_USER_ID=${i#*=}
+ PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form wpcom_user_id=${i#*=}"
+ shift
+ ;;
+ -e=* | --wpcom_user_email=* )
+ PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form wpcom_user_email=${i#*=}"
+ shift
+ ;;
+ -p=* | --plan=* )
+ PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form plan=${i#*=}"
+ shift
+ ;;
+ -o=* | --onboarding=* )
+ PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form onboarding=${i#*=}"
+ shift
+ ;;
+ -u=* | --url=* )
+ WP_CLI_ARGS="$WP_CLI_ARGS --url=${i#*=}"
+ SITEURL="${i#*=}"
+ shift
+ ;;
+ --force_register=* )
+ PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form force_register=${i#*=}"
+ shift
+ ;;
+ --force_connect=* )
+ PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form force_connect=${i#*=}"
+ shift
+ ;;
+ --partner-tracking-id=* )
+ PROVISION_REQUEST_URL="$PROVISION_REQUEST_URL?partner-tracking-id=${i#*=}"
+ shift
+ ;;
+ --ssh-host=* )
+ PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form ssh_host=${i#*=}"
+ shift
+ ;;
+ --ssh-user=* )
+ PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form ssh_user=${i#*=}"
+ shift
+ ;;
+ --ssh-pass=* )
+ PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form ssh_pass=${i#*=}"
+ shift
+ ;;
+ --ssh-private-key=* )
+ PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form ssh_private_key=<${i#*=}"
+ shift
+ ;;
+ --ssh-port=* )
+ PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form ssh_port=${i#*=}"
+ shift
+ ;;
+ --allow-root )
+ WP_CLI_ARGS="$WP_CLI_ARGS --allow-root"
+ shift
+ ;;
+ --wp-cli-path=* )
+ WP_CLI_COMMAND="${i#*=}"
+ shift
+ ;;
+ -h | --help )
+ usage
+ exit
+ ;;
+ * )
+ echo $(usage) >&2
+ exit 1
+ esac
+done
+
+WP_CLI_CHECK=$($WP_CLI_COMMAND --skip-plugins --skip-themes option get home 2>/dev/null)
+if [ -z "$WP_CLI_CHECK" ]; then
+ WP_CLI_EXISTS=0
+else
+ WP_CLI_EXISTS=1
+fi
+
+if [ "$WP_CLI_EXISTS" -eq "1" ]; then
+ WP_CLI_ARGS="$WP_CLI_ARGS --skip-themes --skip-plugins=$($WP_CLI_COMMAND plugin list --field=name | grep -v ^jetpack$ | tr '\n' ',')"
+fi
+
+if [ "$CLIENT_ID" = "" ] || [ "$CLIENT_SECRET" = "" ] || [ "$WP_USER" = "" ]; then
+ echo $(usage) >&2
+ exit 1
+fi
+
+jetpack_shell_is_errored() {
+ if [ -z "$1" ]; then
+ exit 1
+ fi
+
+ JSON_ERROR=$( jetpack_echo_key_from_json "$1" error | xargs echo )
+
+ if [ -z "$JSON_ERROR" ]; then
+ return 1
+ else
+ return 0
+ fi
+}
+
+jetpack_is_wp_cli_error() {
+ if [ -z "$1" ]; then
+ exit 1
+ fi
+
+ if [ ! -z $( echo "$1" | grep Error:) ] || [ -z "$1" ]; then
+ return 0
+ fi
+
+ return 1
+}
+
+jetpack_echo_key_from_json() {
+ if [ -z "$1" ]; then
+ exit 1
+ fi
+
+ echo $1 | sed -n "s/.*\"$2\":\"\([^\"]*\)\".*/\1/p"
+}
+
+# Fetch an access token using our client ID/secret.
+ACCESS_TOKEN_JSON=$(
+ curl \
+ --silent \
+ --request POST \
+ --url https://$JETPACK_START_API_HOST/oauth2/token \
+ --header 'cache-control: no-cache' \
+ --header 'content-type: multipart/form-data;' \
+ --header "Host: public-api.wordpress.com" \
+ --form client_id="$CLIENT_ID" \
+ --form client_secret="$CLIENT_SECRET" \
+ --form grant_type=client_credentials \
+ --form scope=jetpack-partner
+)
+
+if jetpack_shell_is_errored "$ACCESS_TOKEN_JSON"; then
+ echo "$ACCESS_TOKEN_JSON" >&2
+ exit 1
+fi
+
+ACCESS_TOKEN=$( jetpack_echo_key_from_json "$ACCESS_TOKEN_JSON" access_token | xargs echo )
+
+# If we don't have an access token, we can't go further.
+if [ -z "$ACCESS_TOKEN" ] || [ "$ACCESS_TOKEN" = "" ]; then
+ echo "$ACCESS_TOKEN_JSON" >&2
+ exit 1
+fi
+
+# Silently ensure Jetpack is active
+# Intentionally not quoting $WP_CLI_ARGS so that words in the string are split
+if [ "$WP_CLI_EXISTS" -eq "1" ]; then
+ $WP_CLI_COMMAND $WP_CLI_ARGS plugin activate jetpack >/dev/null 2>&1
+fi
+
+if [ -z "$SITEURL" ] && [ "$WP_CLI_EXISTS" -eq "1" ]; then
+ SITEURL=$( $WP_CLI_COMMAND $WP_CLI_ARGS option get siteurl | xargs echo )
+fi
+
+PROVISION_REQUEST_ARGS="$PROVISION_REQUEST_ARGS --form siteurl=$SITEURL"
+
+PROVISION_REQUEST=$(
+ curl \
+ --silent \
+ --request POST \
+ --url "$PROVISION_REQUEST_URL" \
+ --header "authorization: Bearer $ACCESS_TOKEN" \
+ --header "Host: public-api.wordpress.com" \
+ --header 'cache-control: no-cache' \
+ --header 'content-type: multipart/form-data;' \
+ $PROVISION_REQUEST_ARGS
+)
+
+if [ -z "$PROVISION_REQUEST" ]; then
+ echo "{\"success\":false,\"error_code\":\"unknown_error\",\"error_message\":\"Empty response from server\"}" >&2
+fi
+
+if jetpack_shell_is_errored "$PROVISION_REQUEST"; then
+ echo "$PROVISION_REQUEST" >&2
+ exit 1
+fi
+
+# Get the access token for the Jetpack connection.
+ACCESS_TOKEN=$( jetpack_echo_key_from_json "$PROVISION_REQUEST" access_token | xargs echo )
+
+# If we have an access token, set it and activate default modules!
+if [ ! -z "$ACCESS_TOKEN" ] && [ "$ACCESS_TOKEN" != "" ] && [ ! -z "$WPCOM_USER_ID" ] && [ "$WP_CLI_EXISTS" -eq "1" ]; then
+ AUTHORIZE_RESULT=$( $WP_CLI_COMMAND $WP_CLI_ARGS jetpack authorize_user --token="$ACCESS_TOKEN" )
+ if jetpack_is_wp_cli_error "$AUTHORIZE_RESULT"; then
+ echo "{\"success\":false,\"error_code\":\"authorization_failure\",\"error_message\":\"$AUTHORIZE_RESULT\"}" >&2
+ exit 1
+ fi
+fi
+
+echo "$PROVISION_REQUEST"
+exit 0
diff --git a/wp-content/plugins/jetpack/changelog.txt b/wp-content/plugins/jetpack/changelog.txt
new file mode 100644
index 000000000..968d4349e
--- /dev/null
+++ b/wp-content/plugins/jetpack/changelog.txt
@@ -0,0 +1,4683 @@
+== Changelog ==
+
+**This is a list detailing changes for all the past Jetpack releases. For more information about the current release, see [the readme](https://github.com/Automattic/jetpack/blob/master/readme.txt).**
+
+= 7.8 =
+
+* Release date: October 1, 2019
+* Release post: https://wp.me/p1moTy-lvE
+
+**Enhancements**
+
+* Connection flow: remove some of the text from the connection prompt.
+* Dashboard: remove custom About menu page ordering.
+* Dashboard: review and remove unnecessary queries.
+* General: remove files that were deprecated in Jetpack 7.5.
+* General: remove outdated pre-PHP 5.6 era code.
+* Image CDN: check for local file upload before processing post images.
+* Markdown Block: display in the block picker even if the classic Markdown feature is disabled.
+* Recurring Payments: add an alignment option to the button.
+* Recurring Payments: improve the display of connection notifications.
+* Tiled Galleries: the block is now available even if you've disable the "Image Accelerator" feature.
+* WordPress.com REST API: improve detection of the Full Site Editing feature.
+
+**Improved compatibility**
+
+* AMP / Sharing: include Open Graph metadata to AMP Story posts.
+* General: avoid conflicts when using Jetpack alongside other plugins or services that rely on an Autoloader.
+
+**Bug fixes**
+
+* Activity Log: avoid displaying events from the Action Scheduler.
+* Ads Block: avoid PHP errors when loading posts via the WordPress.com interface.
+* Blocks: ensure that all blocks are properly translated when a translation is available.
+* Dashboard: do not display Plans page to non-connected admins.
+* Post Images: look for representative images in inner blocks as well.
+* Shortcodes: add title attribute to Archive.org and Archive.org Book embeds.
+* Sync: avoid issues when using deprecated Sync functions.
+* WordPress.com dashboard styles: fix layout on Plugins > Add New Page, on mobile devices.
+
+= 7.7.2 =
+
+* Release date: September 23, 2019
+
+**Bug fixes**
+
+* General: fix connection issues when attempting to install and connect Jetpack from a mobile app.
+
+= 7.7.1 =
+
+* Release date: September 6, 2019
+
+**Bug fixes**
+
+* Connection Flow: avoid any errors linked to browser cookie policies during connection request.
+* General: additional check to avoid warnings on plugin update.
+* SSO: avoid Fatal errors happening during some log in attempts.
+* Sync: check if IXR client exists to prevent errors when updating the plugin.
+
+= 7.7 =
+
+* Release date: September 3, 2019
+* Release post: https://wp.me/p1moTy-log
+
+**Major Enhancements**
+
+* This release brings in multiple improvements to the WordPress.com connection process, to fix issues site owners may experience when first connecting their site to WordPress.com.
+
+**Enhancements**
+
+* Anti-spam: improve the flow to configure Akismet from Jetpack's Dashboard.
+* Blocks: add new utility to get all CSS classes for a given block.
+* Bruteforce Login Protection: improve Network Activation detection on Multisite networks.
+* Dashboard: update all illustrations to use new color scheme.
+* General: log XML-RPC communication errors between the site and WordPress.com.
+* General: use HTTPS URLs when linking to external sites when possible.
+* General: warn admins when about to delete another admin user that happens to be the main Jetpack admin on the site.
+* Sharing / Publicize: add Open Graph Meta Tags to archive pages.
+* Sitemaps: reduce sitemap cache duration when using Jetpack's Development mode.
+* Social menus: replace the outdated Medium icon with updated logo.
+* Stats: improve method used to enqueue JavaScript when the feature is active.
+* Videos: Add video settings to Jetpack's enhanced video block.
+* Widgets: improve the creation process and display of maps inside the Contact Info Widget.
+* Widgets: add more RSS feed patterns to the Social Icons Widget.
+* Widgets: add new `jetpack_widget_authors_params` filter to the Authors widget, to allow site owners to customize the list of authors.
+* WordPress.com API: add option to manage Full Site Editing.
+* WordPress.com Interface: allow language to be changed even if `WPLANG` constant is defined.
+* WooCommerce Analytics: use core WordPress function to enqueue script asynchronously.
+
+**Improved compatibility**
+
+* Ads: make sure the Ad block generates ads that are compatible with the AMP plugin.
+* Image CDN: update the size of images used in AMP Stories when using the AMP plugin.
+* Responsive Videos: improve compatibility and avoid validation errors when using the AMP plugin.
+* WordPress.com API: avoid errors when used in combination with the Polylang plugin.
+* WordPress.com API: improve compatibility with plugins that alter the behavior of search queries.
+
+**Bug fixes**
+
+* Bruteforce Login Protection: fix the display of the admin notice displayed on Multisite networks.
+* Contact Form: update the feedback post type capability to a valid value.
+* Dashboard: improve the layout of the Connection modal on mobile devices.
+* General: do not redirect during automatic upgrades.
+* Image CDN: support the `medium_large` image sizes.
+* Related Posts: ensure Related Posts can be displayed when using the AMP plugin and Jetpack's Sharing feature.
+* Search: authenticated search requests will now display non-public content.
+* Sitemaps: improve the display of descriptions in video sitemaps, when they include HTML content.
+* Stats: load RTL stylesheet for dashboard widget, to fix layout issues on RTL language sites.
+* WordPress.com API: fix API responses which contain malformed (non-UTF-8) data.
+* WordPress.com Toolbar: limit access to Stats and Plan menu items.
+
+= 7.6 =
+
+* Release date: August 6, 2019
+* Release post: https://wp.me/p1moTy-ljs
+
+**Enhancements**
+
+* Backups: add ability to send SSH credentials.
+* Blocks: allow the insertion and preview of any Jetpack block in the editor, even when the block is only available via a Paid plan.
+* Carousel: use a pointer cursor when hovering over galleries that utilise the Carousel feature.
+* Dashboard: improve the display of the feature cards in the main Jetpack dashboard.
+* General: hide edit post link on your site when viewing it via the WordPress mobile app.
+* oEmbeds: add support for Song.link service.
+* Stats: improve performance of the Stats tracking pixel by eliminating blocking JavaScript.
+* Stats: improve Cache performance by switching from the WordPress Options API to the WordPress Transient API.
+* Support links: use the Beta support form when on a development version.
+* Sync: add a term taxonomy blacklist option, and start blacklisting taxonomies that do not need to be synchronized with WordPress.com.
+* Sync: improve reliability of the synchronization of taxonomies.
+* Videos: ensure any deprecations added in the core video block are not overwritten.
+* Widgets: allow the customization of avatar image options in the Top Posts Widget, via a filter.
+* Widgets: add option to open Flickr gallery images in a new tab.
+* WordPress.com Activity Log: avoid display issues with WooCommerce Product Reviews.
+
+**Improved compatibility**
+
+* AMP: ensure CSS compatibility with the Sharing buttons.
+* AMP: ensure full compatibility with Jetpack's Image CDN.
+* Dashboard: fix layout issues when viewing the dashboard on WordPress.com Business sites.
+* Compatibility suite for shared libraries: fix PHP notice when running suite.
+* Contact Form: ensure the Date picker field does not cause any AMP validation errors.
+
+**Bug fixes**
+
+* Admin Page: fix the behaviour of the Jetpack Videos button in the "My Plan" tab.
+* Admin Page: fix a typo in the Magic Links modal.
+* Connection process: bring back the ability to connect to WordPress.com via XML-RPC or REST API.
+* Custom CSS: fix Media Width label layout issue in Firefox.
+* Dashboard Notices: fix layout issues on sites using an RTL language.
+* Sync: fix home and Site URL synchronization issues on sites with custom Cron implementations.
+* WordPress.com Activity Log: add Action Scheduler to the list of blacklisted post types
+
+= 7.5.3 =
+
+* Release date: July 17, 2019
+* Release post: https://wp.me/p1moTy-k9A
+
+**Bug fixes**
+
+* General: Fixes plugin activation/deactivation hooks that were accidentally disabled.
+* General: Fixes fatal errors that were possible when using pre-7.5 Jetpack internal API.
+
+= 7.5.2 =
+
+* Release date: July 4, 2019
+* Release post: https://wp.me/p1moTy-k9A
+
+**Bug fixes**
+
+* General: Fixes an error when a site's connection to WordPress.com is set to "Safe Mode".
+
+= 7.5.1 =
+
+* Release date: July 2, 2019
+* Release post: https://wp.me/p1moTy-k9A
+
+**Bug fixes**
+
+* General: Fixes an error when trying to delete the Jetpack plugin.
+* General: Fixes supported PHP version declaration.
+
+= 7.5 =
+
+* Release date: July 2, 2019
+* Release post: https://wp.me/p1moTy-k9A
+
+**Enhancements**
+
+* Admin Page: add an option to send a magic link that will help you log in to the mobile apps in one click.
+* Admin Page: improve style and wording of many different sections of the dashboard to clarify the role of each feature.
+* Admin Page: remove feature that would offer you to activate a list of recommended features upon connecting your site to WordPress.com.
+* Backups: include updates to term relationships when backing up Post object changes.
+* Backups: synchronize ABSPATH value to help setting up SSH credentials when using Jetpack Backups.
+* Faceboook Embeds: support new video URL format.
+* Lazy Load: allow adding event handlers to images.
+* Recurring Payments Block: improve the display of the block in the editor.
+* WordAds: update link to daily earnings stats on WordPress.com.
+* WordAds: provide additional details for custom ads.txt entries in the Jetpack dashboard.
+* WordPress.com Toolbar: add colors to Recovery Mode button.
+
+**Improved compatibility**
+
+* Admin Page: improve display of the Jetpack Dashboard in IE11.
+* Sharing: avoid displaying extra list items below the sharing buttons when using the AMP plugin.
+* Staging enviroments: add staging enviroment detection for DreamPress sites.
+
+**Bug fixes**
+
+* Admin Page: fix display of backup details in the Jetpack dashboard.
+* Admin Page: do not disable Widget Visibility and Widgets toggles in Development mode.
+* Sitemaps: ensure links to sitemaps appear in robots.txt
+* Slideshow Block: fix CSS class name.
+* Videos: ensure that Video Poster images are always displayed properly.
+
+= 7.4.1 =
+
+* Release date: June 17, 2019
+* Release post: https://wp.me/p1moTy-kvz
+
+**Bug fix**
+
+* Contact Form Block: avoid errors when trying to edit a form block, when using the Gutenberg plugin.
+
+= 7.4 =
+
+* Release date: June 4, 2019
+* Release post: https://wp.me/p1moTy-jgZ
+
+**Enhancements**
+
+* About Page: remove submenu and add link to page in the footer of Jetpack's dashboard.
+* Admin Page: remove Themes card on Plans tab.
+* Admin Page: consolidate the look of the different discussion settings.
+* Admin Page: add Security Checklist information.
+* Business Hours Block: improve the display of Business Hours.
+* Business Hours Block: Simplify hours format.
+* Comment Form: use HTTP 4xx status codes for comment errors.
+* Contact Form Block: improve styles for better display on mobile devices.
+* General: introduce a new Jetpack Logo package, to make it easier to share and re-use.
+* Multisite: Use modern `wp_initialize_site` hook when automatically connecting new sites.
+* Recurring Payments Block: automatically add button to the post content once you create it.
+* Recurring Payments Block: improve the display of the renewal frequency in button list.
+* Recurring Payments Block: require a paid plan to use the button.
+* Recurring Payments Block: improve the look of the payment modal on mobile devices.
+* Search: add new option for cross-site search permissions.
+* Sharing: update default sharing settings to include buttons.
+* Sitemaps: rename the `jetpack_sitemap_generate` and `jetpack_news_sitemap_generate` filters to the more accurate `jetpack_sitemap_include_in_robotstxt` and `jetpack_news_sitemap_include_in_robotstxt`.
+* Slideshow Block: depending on viewport, display prev/next arrows.
+* Slideshow Block: remove outline when focussing on the block.
+* Sync: offer posts, comments, and comment meta checksums when providing sync status.
+* Tiled Galleries: add `srcset` in the editor for an improved editing experience.
+* WordPress.com Block Editor: allow managing reusable blocks in the WordPress.com interface.
+* WordPress.com Toolbar: display hamburger icon in toolbar when in the block editor.
+* WordPress.com Toolbar: display a link to exit recovery mode when it is active on the site.
+
+**Improved compatibility**
+
+* Display Posts Widget: remove overly opinionated CSS.
+* General: Jetpack now requires PHP 5.3.2, and will display a notice if your site uses an older version of PHP.
+* General: display a notice and log an error if your version of WordPress is not supported by Jetpack.
+* General: Update `Jetpack::get_content_width()` to ensure that only numeric values are used.
+* GIF Block: improve compatibility with the AMP plugin.
+* Shortcodes: bring more of our shortcodes to meet current WordPress Coding Standards to help us maintain these features in the future.
+* Site Health: improve Jetpack errors' messaging in WordPress' new Site Health tools.
+
+**Bug fixes**
+
+* Admin Page: make sure the Jetpack Dashboard is displayed properly in IE11.
+* Admin Page: do not show Plugin Autoupdates card on admin searches.
+* Carousel: avoid scrolling back to the top of the page when you close the Carousel view.
+* Connect Flow: sanitize from parameter when building connection URL.
+* Mobile Themes: fix "View Full Site" and "View Mobile Site" links when WordPress lives in a subdirectory.
+* Recurring Payments Block: avoid invalid subscription amounts.
+* Recurring Payments Block: allow line breaks in the payment button.
+* Related Posts: do not add markup to attachment pages by default.
+* SEO Tools: support taxonomy archive pages in page titles.
+* Sharing: make sure the Whatsapp button works well in all browsers, including Firefox on desktop.
+* Shortcodes: update embed type detection for Medium Collections.
+* Social Icons SVG: switch to the presentation role for better accessibility.
+* Subscriptions: display checkboxes above the comment submit button.
+* Sync: add new WP Cli commands to help in monitoring and updating sync settings.
+* Tracks: limit the length of the strings saved for feature searches.
+* Unit Tests: add support for testing using VVV 3.0.
+* Verification Tools: make sure the feature can be disabled by override.
+* WooCommerce Analytics: remove duplicate self-executing anonymous function.
+* WordPress.com Interface: make sure navigation menu items match the one available in the WordPress.com interface.
+* WordPress.com Toolbar: restore the previous layout.
+* WordPress.com Toolbar: ensure you are properly logged out of your WordPress.com account when you sign out of your site using the toolbar.
+* WP Cli: ensure that WP Cli commands added by Jetpack include translator comments when necessary, to help with translations.
+
+= 7.3.1 =
+* Release date: May 14, 2019
+* Release post: https://wp.me/p1moTy-jgO
+
+**Bug fixes**
+
+* Admin Experience: Correct underline location under a dollar sign.
+* Deprecated Hooks: Do not offer a replacement for jetpack_json_manage_api_enabled since there isn't an equal replacement.
+* Debugger: Clarify labels in the Site Health Info section.
+* Likes and Sharing: Remove duplicate control in the block editor for Likes/Sharing. We added a native block editor plugin, but left the old fallback.
+* WordPress.com Editor: Redirect to a login page when logging out from the block editor on WordPress.com.
+* WordPress.com Toolbar: Add menu icon for smaller screen widths to restore wp-admin navigation menu.
+
+= 7.3 =
+
+* Release date: May 07, 2019
+* Release post: https://wp.me/p1moTy-ipR
+
+**Major Enhancements**
+* We streamlined the default features of Jetpack to make the "out of the box" experience better.
+* WordPress 5.2 will add a new Site Health section to your dashboard. Jetpack already integrates with it, letting you know that your Jetpack features are working!
+
+**Enhancements**
+
+* Admin Experience: Improve our "just in time messages" and "Recommended Features" for new sites setting up Jetpack for the first time.
+* Admin Experience: Add an "About Jetpack" page to let folks know more about Automattic, the company behind WordPress.com and Jetpack.
+* Admin Experience: Add a link to the full list of Jetpack features in the footer of Jetpack dashboard pages.
+* Backups: Add SSH CLI command for hosting integration support.
+* Block Editor: Compose posts with the Block Editor posts via WordPress.com for their Jetpack sites!
+* Block Editor: Transform core images to Tiled Galleries or Slideshow blocks and back!
+* Block Editor: Provide an option to disable particular extensions.
+* Contact Form: Add a "grunion_after_message_sent" hook for after a form submission is e-mailed. Thanks Tim Nolte for contributing to Jetpack!
+* Contact Form: Do not prefill for administrators on their own sites.
+* Grammar and Spelling: Remove from Jetpack. We've chekced the spelling alot over the years, but now time to retire.
+* Membership Block: Add a new block behind the JETPACK_BETA_BLOCKS constant. Stay tuned!
+* Photon: Remove jQuery dependency for photon.js. Same Image CDN awesomeness with less overhead.
+* Portfolios: Remove the "Portfolio Items" description that would display on some themes.
+* Sharing: Add a "sharing_ajax_action" to to allow other plugins and scripts to render sharing buttons. Thanks Darren Cooney!
+* Social Icons: Add Stack Overflow support. Welcome to the Jetpack contributor ranks Muhammad Osama Arshad!
+* Sync: Report details on what is queued up to sync on the status endpoint.
+* Sync: Improve importer detection so we can better handle cases of imported content.
+* Sync: Add an option to disable sync for an entire network.
+* Sync: Adds new WP-CLI Jetpack Sync commands: settings, enable, disable, reset.
+* Testimonials: Sort by menu order to give site owners more flexibility for display. Thanks Felipe Elia!
+* Tiled Galleries: Add improved layout for when images are in the process of uploading.
+* Tiled Galleries: Add responsive imaging (srcset) support to the Tiled Gallery block.
+* WordAds: Add location id (e.g. under the post) to the ad calls.
+* WordPress.com API: Add behind the scene improvements to support the WordPress.com site management experience.
+* WordPress.com API: Add the public property to the Post Types endpoint response.
+* WordPress.com Menu Bar: Redesign to direct navigation items to WordPress.com instead of duplicating experiences.
+
+**Improved compatibility**
+
+* Blocks: Use the Editor's "BlockIcon" for native placeholder icons instead of custom CSS.
+* Blocks: Drop i18n wrapper, use @wordpress/i18n directly. This means it will be easier and faster to provide translated bits of text.
+* Blocks: Move block development to the Jetpack repo. You shouldn't see any changes, but this helps us make Jetpack Blocks better faster.
+* Block Editor: Improve the experience of using the Block Editor via the WordPress.com dashboard.
+* Browser Compatibility: Remove legacy code for Internet Explorer 10.
+* Coding Standards: Update our code to match the latest WordPress coding standards in various places.
+* Likes and Sharing: Add Likes and Sharing settings as a Block Editor extension.
+* Related Posts: Improve the internationalization of the "in X category" text.
+* Simple Payments: Easily convert old shortcode-style Simple Payment buttons to a block.
+
+**Bug fixes**
+
+* Admin Dashboard: Improve headings when searching for Jetpack features.
+* Admin Dashboard: Remove legacy views no longer used in Jetpack.
+* Blocks: Fix some design oddities in Form and Contact Info blocks.
+* Carousel: Allow any title to be displayed. We used to try to be smart about default file names, but that caused some problems.
+* Development Mode: Display fewer sections of the Admin Dashboard. Some simply don't apply in Development Mode.
+* Google Plus: Remove from Social Icons and Sharing since the service has retired.
+* Internationalization: Translate various sections missed, such as "just in time messages" and block search keywords.
+* Manage: Remove Manage as an independent module. These features have been fully integrated for a few versions now.
+* Multisite: Restore ability to connect subsites via the Network Admin.
+* Open Graph Tags: Prevent a PHP notice on some author pages.
+* Sharing: Improve accessibility of sharing buttons by increasing contrast ratio. Props https://titan.as
+* Sharing: Fix the alignment of the official buttons for LinkedIn and Pinterest.
+* Shortcodes: Retire the Google Video, Jetpack Subscribe, and Digg shortcodes.
+* Slideshow: Fix a JavaScript error that occurs when block is first added.
+* Slideshow: Add slideshow images to Open Graph tags when using the Slideshow block.
+* Social Icons: Remove Google+, uses the generic Google now.
+* Subscriptions: Correct conflicts that were possible with the checkboxes after a comment submission form.
+* Theme Tools: Ensure Featured Content tag is retained on a post after saving. Thanks Anis Ladram, you're a Jetpack contributor now!
+* Uninstalling Jetpack: Prevent notice about JETPACK__PLUGIN_DIR already being defined when programmatically uninstalling Jetpack. (But why would you uninstall?)
+* Widgets: Remove the Cookies & Consents Banner (not just hide it) after consenting. Thanks Tony Tettinger!
+
+
+= 7.2.1 =
+* Release date: April 04, 2019
+* Release post: https://wp.me/p1moTy-h7o
+
+* Feature Hints: display suggestions only for features available under the site's current plan.
+* Feature Hints: improve visual display to make more distinct from search results.
+* Feature Hints: disable hints once administrators have dismissed three hints.
+* Slideshow Block: resolve an issue that broke navigating between images.
+
+= 7.2 =
+
+* Release date: April 02, 2019
+* Release post: https://wp.me/p1moTy-foe
+
+**Major Enhancements**
+
+* Adds a Repeat Visitor block that controls block visibility based on how often a visitor has viewed the page.
+* New option to disable Ads blocks for visitors on mobile devices.
+
+
+**Enhancements**
+
+* Admin Dashboard: improve text and design to make your administration experience all the better.
+* Jumpstart: streamline what features are suggested to be activated when setting up Jetpack for the first time.
+* Password Checker: adds a password checker class that will help Jetpack let you know if you're using a weak password. More about this coming in a future release!
+* Plans: refactor how Jetpack Plans are coded within Jetpack to improve performance and help prevent any future bugs.
+* Post Images: provide the image itself when requesting an attachment's post image.
+* REST API: Enable Likes and Sharing meta field for all post types.
+* Related Posts: improve HTML markup for related posts, with emphasis on accessibility.
+* Search: add an easy way to see the raw Jetpack Search query results in the search page's source code.
+* Shortcodes: allow links in Quiz shortcode explanations.
+* Widgets: improve the text for the Blog Stats widget when stats data can not be retrieved from WordPress.com.
+
+**Improved compatibility**
+
+* General: require WordPress 5.0! To celebrate, we cleaned out some compatibility code that supported older versions. We know how to party.
+* General: update various parts of Jetpack to fully align with WordPress coding standards to make developing Jetpack easier!
+* Connection: notify site owners when a plugin or theme is double-encoding URL redirects.
+* Shortcodes: update the Ustream shortcode to use the HTML5 player for a better experience on all browsers.
+* Shortcodes: add AMP support for Crowdsignal polls and shortcodes.
+* Sitemaps: add thumbnails to video sitemaps to improve compatibility with Google Search Console. Props Adam Heckler!
+* Sync: improve performance when using the VIP Legacy Redirect plugin.
+* Twenty Nineteen Compatibility: prevent sharing buttons overlapping with the Like button. Props Torres!
+* VideoPress: update right-to-left language CSS to remove extra styles only used on browsers no longer supported.
+* Widgets: improve rendering of Contact Info widget map when using the AMP plugin.
+
+**Bug fixes**
+
+* Admin Dashboard: fix an error that you'd see in the console when changing your Carousel settings.
+* Blocks: fix an issue where sometimes we would attempt to register a particular block twice. I'm looking at you, Related Posts.
+* Blocks: display all Business Hours details, even if they're the default set.
+* Blocks: fix an error that occurred when loading some translations in the Block Editor.
+* Blocks: resolve a conflict between the Ads block and infinite scroll that would cause new posts to sometimes not load.
+* General: ensure the proper Jetpack plan is reflected throughout Jetpack and the administrative dashboard.
+* Plugin Search: display Akismet and VaultPress plugin cards when WordPress.org suggests them.
+* Publicize: remove unused assets, like images and JavaScript that aren't needed anymore.
+* Related Posts: restore use of the jetpack_relatedposts_filter_options filter.
+* Security: Improvements to the Likes feature and the Slideshow block.
+* Sharing: update WhatsApp to be more consistent with the other sharing buttons.
+* Shortcodes: remove Lytro service, which closed in March.
+* Stats: properly handle an error from the REST API that sometimes caused issues with the Stats Dashboard.
+* Widgets: display all characters in an address from Contact Info correctly when sometimes we encoded those that we'd expect in an URL.
+* Widgets: improve the performance of the Contact Info widget by eliminating unused JavaScript.
+
+= 7.1.1 =
+
+* Release date: March 06, 2019
+* Release post: https://wp.me/p1moTy-foJ
+
+**Bug fixes**
+
+* General: avoid conflicting with other plugins when suggesting Jetpack features on the Plugins screen.
+* Publicize: avoid errors when the feature is not active on a site.
+* Widgets: improve performance of the Top Posts and the Blog Stats widgets on high-traffic sites.
+* Subscriptions: fix an issue that prevented displaying subscribers count in the subscription forms.
+* Tiled Galleries / Slideshows: ensure they can be displayed properly in Internet Explorer 11.
+
+= 7.1 =
+
+* Release date: March 05, 2019
+* Release post: https://wp.me/p1moTy-e9x
+
+**Major Enhancements**
+
+* Block Editor: this release introduces 6 new blocks:
+ - the Ads block allows you to insert different ads from [our WordAds program](https://jetpack.com/support/ads/) within your posts and pages.
+ - the Mailchimp block allows your readers to easily subscribe to your Mailchimp newsletter.
+ - the Video block supports VideoPress videos if you've purchased our Premium or Professional plan.
+ - the Slideshow block allows you to insert beautiful slideshows in your posts and pages.
+ - The Business Hours blocks is useful for companies who want to display their business's Opening Hours on their site.
+ - The Contact Info block is useful for any business who may want to display useful information on a post or page.
+
+**Enhancements**
+
+* Admin Page: move Carousel settings from Performance to Writing section.
+* Ads: include search results pages under the `Archive` toggle.
+* Block Editor: improve block registration structure for better management of block availability.
+* General: remove IE8 support fallbacks.
+* General: add feature suggestions to the plugin search screen.
+* Image CDN: add new mode that disables the creation of resized images, thus saving disk space.
+* Instagram: update embed to support Instagram TV URLs.
+* Post Images detection: add support for alt text.
+* Plans: clarify upgrade prompts in the Jetpack dashboard's Plans page.
+* Publicize: remove the Google+ interface as the Social Network is now deprecated.
+* Related Posts: update block to allow for up to 6 related posts.
+* Social Menus & Icons: add Discord Support.
+* Support: add additional tests to check when Jetpack isn't working as expected and ensures all current debugging platforms use the same testing list.
+* Simple Payments: add generic currency fallback symbol.
+* Sync: further performance improvements in PHP 7+ environments.
+* Woocommerce Analytics: include product type with analytics data.
+
+**Improved compatibility**
+
+* General: replace all .dev TLD references by .test as the .dev TLD will soon become available for registration.
+* PHP 7.3: introduce automated testing for PHP 7.3.
+* Site Accelerator: ensure compatibility with the AMP plugin.
+* Twenty Nineteen: fix Top Posts and Pages Widget image list margins.
+* WordPress 5.1 Compatibility: update usage of `wp_schedule_single_event` to match changes in WordPress.
+
+**Bug fixes**
+
+* Copy Post: ensure the feature can be used when using non-standard post formats.
+* Infinite Scroll: fix vertical spacing for new posts loaded with Infinite Scroll.
+* Internationalization: fix minor problem affecting translations in the block editor.
+* Mobile Theme: fix PHP notices when trying to display gallery images.
+* Mobile Theme: fix redirection issues when clicking on the "Desktop version" links.
+* Photon: add paypalobjects.com to the list of banned domains, as this domain already relies on a CDN.
+* Publicize / Subscriptions: do not show message at the top of the editor when creating a private post.
+* Spelling / Grammar: fix error when spellchecking the contents of a Classic block in the block editor.
+* Top Posts: allow fetching posts from a long timeframe when using the `jetpack_top_posts_days` filter.
+* Related Posts: avoid display a dulplicated set of related posts when using the Related Posts block.
+* REST API: fix a bug causing Likes settings on a post to sometimes be flipped.
+* Security: fix an XSS vulnerability in the "My Community" widget.
+* Security: avoid bypassing Protect's Math Fallback challenge.
+* Site Stats: do not show the Jetpack logo in the Stats dashboard widget title in the Screen Options tab.
+* Theme Tools: support alternative Pinterest domain extensions in the Social Menus tool.
+* Widgets: support alternative Pinterest domain extensions in the Social Icons Widget.
+* Widgets: update the Cookies & Consents Banner to be fully accessible on mobile devices.
+
+= 7.0.1 =
+
+* Release date: February 14, 2019
+* Release post: https://wp.me/p1moTy-eFX
+
+**Improved compatibility**
+
+* Publicize: update LinkedIn connections to use newer API, anticipating changes with LinkedIn's API v1 on March 1st.
+* Publicize: display a message inviting site owners to reconnect their site to their LinkedIn profile.
+* Publicize: remove section in Settings > Sharing in the dashboard.
+
+**Bug fixes**
+
+* Tiled Galleries: avoid errors when converting a tiled gallery into a block.
+* Security: ensure json_encode()d data safely output to the page.
+* Shortlinks: do not show Jetpack Sidebar in the block editor if Shortlinks are not available.
+* Sync: avoid errors in WordPress' code editor, for sites using PHP 7 with `fastcgi_finish_request` enabled.
+
+= 7.0 =
+
+* Release date: February 05, 2019
+* Release post: https://wp.me/p1moTy-dqO
+
+**Major Enhancements**
+
+* Block Editor: introduce a new Gif block to help you quickly search and add Gif images to your posts.
+* Copy Post: this new feature allows you to quickly create a new draft based on a post that's already published.
+
+**Enhancements**
+
+* Block Editor: update the way we check for available blocks and extensions.
+* Connection flow: display a notice upon connection when the site is suspended.
+* Contact Form: add more options to customize the look of the submit button.
+* Likes / Publicize: in the Jetpack Dashboard, add explanation to clarify the role of the features.
+* REST API: add likes and sharing settings to the REST API Post response.
+* Sharing: deprecate the Google+ sharing Button.
+* Sharing: deprecate the Google+ embed shortcode.
+* Shortcodes: rely on WordPress Core to handle SlideShare slideshow embeds.
+* Shortcodes: cache the output of the Twitter shortcode.
+* Subscriptions: remove obsolete polyfill JavaScript from the Subscriptions form.
+* Subscriptions: allow more customization of the subscription form's submit button.
+* Sync: improvements to the synchronization of plugin and theme updates.
+* Sync: improve performance for sites using PHP 7, with `fastcgi_finish_request` enabled.
+* Sync: synchronize plugin and theme fatal errors reported by WordPress 5.1.
+* Widgets: deprecate the Google+ widgets.
+* WordPress.com: allow the display of plugin action links in the WordPress.com plugins' interface.
+
+**Improved compatibility**
+
+* Lazy Images: fix a compatibility issue with themes that overwrite classes on html.
+* Contact Form: ensure contact form submissions with long words do not break the site layout, regardless of the theme.
+* Publicize: remove the option to connect your site to a Google+ account, in anticipation of the service's shutdown.
+
+**Bug fixes**
+
+* Admin Page: avoid PHP notices when looking at non-Jetpack admin pages.
+* Carousel: fix display issue when viewing images with long captions.
+* Carousel: avoid errors when fetching comments in the Carousel modal.
+* CSS: fix the behavior of the CSS concatenation filter.
+* Multisite: fix the display of the main connection banner.
+* Protect: ensure the Math fallback is displayed when necessary.
+* Publicize: avoid Fatal Errors on sites using Development Mode.
+* Responsive videos: do not apply for videos that benefit from WordPress' own Responsive Embeds solution.
+* Shortcodes: only load Mailchimp CSS when needed.
+* Subscriptions: display subscription options below the comment form, even when you are logged in to your WordPress account.
+* WordPress.com REST API: add new endpoint to allow the creation of a WooCommerce connection via the API.
+
+= 6.9 =
+
+* Release date: January 10, 2019
+* Release post: https://wp.me/p1moTy-cEZ
+
+**Major Enhancements**
+
+* Block Editor: this release introduces new blocks: a Subcription form block, a Tiled Gallery block, and a Related Posts block.
+
+**Enhancements**
+
+* Admin Page: several changes to improve navigation and connection flows for new and existing Jetpack site owners.
+* Admin Page: make the Jetpack dashboard wider on large screens for a better experience.
+* Affiliate tools: offer options for affiliate partners to manage affiliation links on their site.
+* Carousel: add support for the new Tiled Gallery block.
+* Contact Form: use the comment blacklist to filter contact form submissions.
+* Dashboard notices: automatically dismiss notices once a feature has been activated.
+* Dashboard notices: fix styling to work better with the Hello Dolly plugin.
+* Internationalization: add new locales, ensure existing ones are up to date.
+* REST API: new endpoint to expose Gutenberg block and plugin availabilty.
+* Search: add hook to get_filters() to allow the use of custom filters.
+* Shortcodes: add new Mailchimp shortcode to insert Mailchimp subscription forms anywhere in your posts and pages.
+* SSO: offer message introducing the feature to new users.
+* Stats: improve the design of the Stats dashboard widget.
+* Widgets: add filter to set DoNotTrack in Twitter Timeline widget.
+* WordPress.com REST API: add new option to set sites to private.
+
+**Improved compatibility**
+
+* AMP: ensure that all Jetpack features are compatible with the latest version of the AMP plugin. Solves issues previously encountered with sharing buttons and stats.
+* Images: ensure that images inserted with new block editor can be used in Open Graph Meta tags, Related Posts, and Publicized posts.
+* PHP 7.3: avoid PHP warnings so the plugin can be fully compatible with the latest version of PHP.
+* Sharing: do not add Jetpack's Twitter Meta Tags when the WP To Twitter plugin is active.
+* Twenty Nineteen: additional style adjustments to make sure all Jetpack widgets look good with the theme.
+* WooCommerce: do not include product reviews in comment counts in the WordPress.com REST API.
+
+**Bug fixes**
+
+* Admin Page: update feature limits mentioned when disconnecting Jetpack from WordPress.com
+* Block Editor: fix loading of translations in the editor when Jetpack's Site Accelerator feature is active.
+* Carousel: ensure that Carousel works well with the Gallery block in the new block editor.
+* Carousel: do not open modal when clicking on a link in a caption
+* Publicize: improve synchronization of sharing settings with WordPress.com.
+* Publicize: only display Gutenberg Publicize UI to users with the correct permissions.
+* Responsive videos: don't load if theme supports core responsive embeds.
+* Search: fix fatal error when the Search Widget is enabled while the site is in Development Mode.
+* Sharing: update Tumblr official sharing button.
+* Shortcodes: update YouTube shortcode to support more video link formats.
+* Shortlinks: add the option to view shortlinks in the block editor.
+* Simple Payments: only register block when all needed data is available.
+* Widgets: only load Social Icons widget scripts and styles when necessary.
+* WooCommerce Analytics: avoid Fatal Errors in some specific site setups.
+* WooCommerce Analytics: improve performance by avoiding unnecessary calls to the feature when it is not needed.
+
+= 6.8.1 =
+
+* Release date: December 6, 2018
+* Release post: https://wp.me/p1moTy-d3t
+
+**Bug fixes**
+
+* Contact Form: security changes to improve the display of success messages after submitting a form.
+* Publicize: avoid Fatal errors when trying to create or edit posts from a Custom Post Type that supports Publicize.
+* Sync: improve synchronization of WooCommerce events.
+* WordPress.com REST API: handle WooCommerce Product reviews for a better display in apps that use the API.
+
+= 6.8 =
+
+* Release date: November 27, 2018
+* Release post: https://wp.me/p1moTy-cee
+
+**Major Enhancements**
+
+* This release introduces the first wave of Jetpack blocks built for the new block editor, available in WordPress 5.0.
+
+**Enhancements**
+
+* General: improve ability to create and troubleshoot Jetpack connections.
+* REST API: new endpoint for testing the Jetpack connection.
+
+**Improved compatibility**
+
+* Akismet: improve caching of all queries for Akismet status.
+* Spellcheck / Grammar: we've made sure the Jetpack feature did not create any error when using the block editor.
+* Twenty Nineteen: ensure compatibility with Jetpack's widgets.
+
+**Bug fixes**
+
+* Asset CDN: do not try to serve assets from non-public versions.
+* Carousel: handle galleries created via the Gallery block in the new block editor.
+* Photon: make sure our image CDN is fully compatible with the block editor.
+
+= 6.7 =
+
+* Release date: November 6, 2018
+* Release post: https://wp.me/p1moTy-aEq
+
+**Major Enhancements**
+
+* Site acceleration: new toggle to serve both your images and static files (like CSS and JavaScript) from our CDN.
+* Activity: update Jetpack dashboard to include links to our Activity page, where you can view a record of every change and update on your site.
+
+**Enhancements**
+
+* Admin page: add site Activity card.
+* Blocks: provide a mechanism so editor blocks can be translated.
+* Blocks: enqueue Jetpack blocks in the block editor when blocks are available.
+* Debug tools: add information about missing XML extension in self-help tools.
+* REST API: introduce endpoint for retrieving related posts of a particular post.
+* Search: add an advanced `excess_boost` param which can be adjusted with filters to fine tune query scoring.
+* Sharing / Publicize: change the icons used in the Jetpack dashboard to clarify where the configuration links lead.
+* Secure Sign On: update wording on admin pages to avoid confusion.
+* Shortcodes: update the Polldaddy shortcode to use the new brand, Crowdsignal.
+* Sitemaps: coding standards changes.
+* Site Verification Tools: improve display of the tool's description on mobile devices.
+* Unit Tests: improve process for faster tests.
+
+**Improved compatibility**
+
+* Themes: ensure compatibility between Jetpack features and the new WordPress default theme, Twenty Nineteen.
+* AMP: add support for GitHub's Gist shortcodes.
+* PHP 7.3: update Infinite Scroll to avoid PHP warnings when using the latest version of PHP.
+* Protect: fix output of Protect's Math challenge on login forms created by third-party plugins.
+* Plugins: add a WordPress.com themed plugins page for users managing their plugins via the WordPress.com interface.
+* Site Verification Tools: do not enable Google's Auto-verification option when a site using a maintenance / coming soon plugin.
+
+**Bug fixes**
+
+* Blocks: update the VR block to be fully compatible with the latest version of WordPress and Gutenberg.
+* Comment Likes: only prefetch domains used by the feature.
+* CSS Concatenation: make sure all concatenated CSS is up to date.
+* Featured Content: no longer hides the "featured" tag from the WordPress.com Editor or the mobile apps.
+* Geolocation: avoid a PHP notice when setting location for a post in the WordPress.com post editor.
+* Likes: ensure that the Likes column is accessible.
+* REST API: Ensure only strings as escaped as URLs.
+* Search: avoid PHP warning with Search widget.
+* Sharing: improve accessibility of email sharing button.
+* Simple Payments / Widget Visibility: avoid potential Fatal errors on some specific server configurations when updating Jetpack.
+* Sitemaps: remove double encoding of site name in news sitemap.
+* Sitemaps: ensure homepage is only included once.
+* Sitemaps: provide richer "not found" message to site admins.
+* Sitemaps: ensure sitemap is refreshed faster after upgrading Jetpack.
+* Sitemaps: avoid protocol mismatches between the sitemaps and the site.
+* Site Verification Tools: make sure we validate meta tags when saving.
+
+= 6.6.1 =
+
+* Release date: October 10, 2018
+* Release post: https://wp.me/p1moTy-aEt
+
+**Bug fixes**
+
+* Sitemaps: improve initial sitemap creation process.
+* Widgets: fix missing CSS for the Social Icons Widgets.
+
+= 6.6 =
+
+* Release date: October 9, 2018
+* Release post: https://wp.me/p1moTy-aa1
+
+**Major Enhancements**
+
+* Verification Tools: enable one-click site verification and sitemap.xml registration with Google.
+
+**Enhancements**
+
+* Admin Interface: update all Jetpack settings screens to use a similar design.
+* API: add flags to determine if Jetpack Search is enabled and supported.
+* CDN: First Beta version of the Photon CDN -- Speed up sites and increase max concurrent connections through Photon by cloud-hosting Jetpack and WordPress Core scripts, styles, and assets.
+* Contact Form: add filters to allow customizing the class attributes of inputs and buttons.
+* General: add more constants to error log for the Jetpack test suite.
+* Gutenberg: add infrastructure necessary to add new blocks via Jetpack.
+* Lazy Images: load the placeholder via the `srcset` attribute instead of the `src` attribute.
+* Masterbar: add link to Activity Log.
+* Publicize: the Path Social Network is closing in October. The option has consequently been removed from the Publicize interface.
+* Search: improve the feature activation process.
+* Search: update the admin interface to give more information about what the feature does and how it can be used.
+* Simple Payments: update all mentions of the product for a more consistent naming convention and less confusion for both site owners and translators.
+* Sync: log action when an attachment is added to a post for the first time.
+* Sync: add URL details to synchronization requests.
+* Sync: detect if a post is saved via Gutenberg when synchronizing post events.
+
+**Improved compatibility**
+
+* Shortcodes: update Mailchimp shortcode to match the new format offered by Mailchimp.
+
+**Bug fixes**
+
+* CSS Concatenation: add Authors and Social Icons widgets to concatenated styles.
+* Featured Content: avoid registering duplicate Post Types.
+* Geo Location: only enqueue Dashicons when necessary.
+* Google Analytics: do not output tracking code when the "Enhanced eCommerce" option is active, but the WooCommerce plugin is not.
+* Infinite Scroll: add a Privacy Link to the site's footer if a Privacy Policy was set up via WordPress's privacy options.
+* Infinite Scroll: fix video playback of VideoPress videos loaded via Infinite Scroll.
+* Protect: fix layout of legend that prompts the user to solve the math fallback so it works better in all languages.
+* Responsive Videos: avoid PHP notice.
+* Sharing: do not record stats if the stats module is disabled.
+* Sharing: allow saving sharing button options on media edit page as well.
+* Shortcodes: ensure we build minified and RTL stylesheets for slideshows.
+* Simple Payments: Stop contributors from creating inaccessible buttons with a "pending" post status.
+* Sitemaps: no longer add images attached to non-published posts to the image sitemap.
+* Slideshows: ensure arrows point in the right direction for RTL Languages.
+* Sync: avoid PHP notices when synchronizing user information.
+* VideoPress: avoid duplicate rel attributes in links.
+* VideoPress: do not block access to the Video settings for our customers using a 2-year plan.
+
+= 6.5 =
+
+* Release date: September 4, 2018
+* Release post: https://wp.me/p1moTy-a7U
+
+**Major Enhancements**
+
+* WordAds: Added ability to include custom ads.txt entries in the ads module.
+
+**Enhancements**
+
+* Admin Page: Added ability to disable backups UI by filter when VaultPress is not activated.
+* Comments: Moved the Subscription checkboxes on a comment form from after the submit button to before the submit button.
+* General: Removed the outdated "Site Verification Services" card in Tools.
+* General: Removed jetpack_enable_site_verification filter. We recommend filtering access to verification tools using jetpack_get_available_modules instead.
+* General: Simplified the logic of Jetpack's signed HTTP requests code.
+* Lazy Images: Updated lazy images to use a default base64 encoded transparent to reduce a network request.
+
+**Improved compatibility**
+
+* Geo Location: Fixed a compatibility issue with other plugins that added meta attributes to site feeds with the `rss2_ns`, `atom_ns` or `rdf_ns` filters.
+
+**Bug fixes**
+
+* AMP: Fix PHP notice when rendering AMP images with unknown width and height.
+* Contact Forms: We fixed an issue where personal data eraser requests didn't erase all requested feedback.
+* General: Improves compatibility with the upcoming PHP 7.3.
+* General: Updated input validation for meta tags given in site verification.
+* Lazy Images: Deprecated jetpack_lazy_images_skip_image_with_atttributes filter in favor of jetpack_lazy_images_skip_image_with_attributes to address typo.
+* Sharing: Fixed duplicate rel tags on Sharing links.
+* Search: Fixed an issue where a CSS and JavaScript file could be enqueued unnecessarily if the Search module was activated and if the site was using the Query Monitor plugin.
+* Shortcodes: Updated Wufoo Shortcode to always load over https and use async form embed.
+* Widgets: Fixed excessive logging issue with Twitter Timeline widget.
+* Widgets: Removed cutoff date check for Twitter Timeline widget as it is no longer necessary.
+* Widgets: Added decimal precision validator to Simple Payments Widget price field on the Customizer for supporting Japanese Yen.
+
+= 6.4.2 =
+
+* Release date: August 10, 2018
+* Release post: https://wp.me/p1moTy-9pL
+
+**Bug fixes**
+
+Comments: We fixed an error that broke functionality of Social Login for comments.
+
+= 6.4.1 =
+
+* Release date: August 8, 2018
+* Release post: https://wp.me/p1moTy-9pc
+
+**Bug fixes**
+
+Comments: We fixed an error that broke functionality of nested comments.
+
+= 6.4 =
+
+* Release date: August 7, 2018
+* Release post: https://wp.me/p1moTy-9md
+
+**Enhancements**
+
+* Connection: Updated connect splash screen with new content.
+* Sharing: Sharing section in wp-admin will now redirect to Calypso instead.
+* Docs: Added documentation for retrieving provision status of a site.
+* Shortcodes: Added oEmbed support for flat.io.
+* Widgets: Added `jetpack_top_posts_widget_layout` filter that allows you to create a custom display layout for the Top posts widget.
+* Privacy tools: Identify the data export/erasure callbacks for Feedback posts using associative keys, to better match the convention in Core.
+* Privacy tools: Added the `grunion_contact_form_delete_feedback_post` filter hook to allow specific Feedback posts to be bypassed during data erasure requests, similar to the `wp_anonymize_comment` filter in Core.
+* Contact Fork: Disabled random table optimizations on core tables.
+
+**Improved compatibility**
+
+* AMP: Improved AMP compatibility for Comments iframe.
+* General: The SEO Framework is no longer a conflicting Open Graph plugin and is now better compatible with Jetpack.
+
+**Bug fixes**
+
+* Shortcodes: Removed extra black bars from YouTube embeds as controls are inside the container now.
+* Simple Payments: Fixed the custom post type bug that affected Simple Payments widget for 2 year subscriptions.
+* Simple Payments: Fixed site failure which happens on Multisite installation with Simple Payments widget.
+* Simple Payments: Fixed syntax and misc compatibility issues with Simple Payments widget on PHP 5.2.
+* Simple Payments: Added warning for admin users if Simple Payments is not enabled but there are products published on pages/posts as a widget.
+* Lazy Images: Fixed an issue with images not loading while updating quantity in WooCommerce shopping cart.
+* Lazy Images: Fixed centered images that do not crop properly when no JavaScript is enabled.
+* General: Fixed auto scrolling to top when following the Quick Tour buttons.
+* General: Removed ability to set custom name for Site Identity section.
+* General: Added advanced control capabilities to image extraction from posts.
+
+= 6.3.3 =
+
+* Release date: July 30, 2018
+* Release post: https://wp.me/p1moTy-9n0
+
+**Facebook API Maintenance**
+
+On the 1st of August, 2018 Facebook sunsets its API allowing to post updates to your Profile Page. Only the API allowing to post to Facebook Pages will remain. This required several changes to Jetpack that we are presenting in this release:
+
+* Publicize: making sure we are handling existing connections gracefully.
+* Publicize: using logo font instead of images to make the UI up to date and mobile ready.
+* Publicize: removing the ability to select Facebook Profile connections in the UI.
+
+**Bug fixes**
+
+* General: properly handle Jetpack connection owner transition process.
+
+= 6.3.2 =
+
+* Release date: July 4, 2018
+* Release post: https://wp.me/p1moTy-96E
+
+**Bug fixes**
+
+* Simple Payment: Fix compatibility issues with PHP versions 5.3 and below
+
+= 6.3 =
+
+* Release date: July 3, 2018
+* Release post: https://wp.me/p1moTy-8ag
+
+**Major Enhancements**
+
+* Simple Payment: Added Simple Payment Products as Widgets, with the option to manage them via the Customizer.
+
+**Enhancements**
+
+* Connection: Added a new connect splash screen content.
+* Jetpack Dashboard: We removed the labels reading 'PAID' in order to introduce a better way to remark paid features.
+* General: Added support to display geo-location data added to posts and pages with Calypso.
+
+**Improved compatibility**
+
+* Protect: We solved an issue related to interaction with bbPress when trying to log in via a bbPress login widget. You would get redirected a few times to log in again after solving the math puzzle.
+
+**Bug fixes**
+
+* Comments: Implemented Core WordPress' Comment Cookie Consent Checkbox in Jetpack Comments.
+* General: We solved an issue that arised when using the Front End Editor feature plugin. A fatal error wass thrown due to us assuming the `enter_title_here` filter would only run within wp-admin.
+* General: Fixed a compatibility problem between WordPress TinyMCE and Jetpack Markdown when visiting the WordPress Dashboard.
+* Lazy Images: Fixed behavior for when JavaScript is disabled.
+* Markdown: We fixed the naming of the class used for code blocks that specify a language.
+* Simple Payments: Fixed an error when the user had published Simple Payment Products but their Professional Subscription had expired.
+* Sitemap: We fixed the format of the date shown for videos on the video sitemap.
+* Stats: We fixed the width of the Stats page for wide screens.
+
+= 6.2.1 =
+
+* Release date: June 8, 2018
+* Release post: https://wp.me/p1moTy-8am
+
+
+**Bug fixes**
+
+* AMP: We fixed the rendering of the stats pixel for legacy, non-paired, non-canonical AMP pages.
+* Shortcodes: Fixed a fatal coming form the VR shortcode when using the Gutenberg editor in the frontend.
+
+= 6.2 =
+
+* Release date: June 5, 2018
+* Release post: https://wp.me/p1moTy-88v
+
+**Major Enhancements**
+
+* Shortcodes: Added Gutenberg block for the [vr] shortcode.
+
+**Enhancements**
+
+* AMP: Allow Jetpack features to work on AMP pages, and prevent Jetpack features from rendering to the front end at all.
+* Content Options: We now exclude Custom Post Types like Portfolio and Testimonial when we toggle content/excerpt via the Blog Display option in the customizer.
+* Cookies & Consent Widget: Added a "top" option for the cookie widget position. The existing bottom of the screen position is the default.
+* Tiled Galleries: use Photon if active when a Tiled Gallery links to media file.
+
+**Improved compatibility**
+
+* Widgets: Deprecated the use of Widget IDs in the Twitter Timeline Widget given that Twitter deprecates Widget IDs on July, 27th 2018.
+
+**Bug fixes**
+
+* Contact Form: Fixed an issue with undefined variables and a warning being logged when submitting the Contact Form.
+* Contact Form: Fixed scrolling/height for very large contact forms.
+* Widgets: Fixed Cookies & Consent Widget's bottom margin for themes that set a specific margin for forms.
+* Related Posts: Made it not try to fetch related posts for an unpublished post.
+* Sharing: Fixed an issue that resulted in wrong URLs for sharing on WhatsApp.
+* Sharing: Fixed the way we check if Akismet is active and has a valid key by caching the result of the verification.
+* Shortcodes: Fixed the Facebook shortcode in wp-admin.
+* Widget Visibility: Fixed styling for MS Edge.
+* Widgets: Removed .widget class from Cookies and Consent widget styles since .widget is not used in every theme.
+
+= 6.1.1 =
+
+* Release date: May 22, 2018
+* Release post: https://wp.me/p1moTy-85t
+
+**Enhancements**
+
+* Ads: Added new setting for Banner consent expiration. Added new filter jetpack_disable_eu_cookie_law_widget, which can be used to disable the banner.
+* Ads: Added a new personalized-ads-consent cookie for ads-enabled sites.
+* Ads: Added requirement and notice, and button-click opt-in for ads module users.
+* Ads: When a user site has a Privacy Policy page set (introduced in 4.9.6), we now default to using that privacy policy as a custom policy URL.
+* GDPR: A new warning is displayed while configuring an instance of the EU Cookie Law widget: "Caution: The default policy URL only covers cookies set by Jetpack. If you're running other plugins, custom cookies, or third-party tracking technologies, you should create and link to your own cookie statement."
+* GDPR: Added Feedback data (i.e., Contact Form Submissions) to the Personal Data exported and/or erased by the latest version of WordPress core.
+
+**Bug fixes**
+
+* Ads: We updated Ads behavior to not show unless the visitor is on the main query within the loop.
+* General: We fixed a bug that resulted in an alert box showing for sites set to languages deriving from main ones.
+* Lazy Images: Fixed a bug where images would disappear when scrolling.
+* Sharing: make sure JS files can be loaded on development sites.
+* Sharing: Added check for validating Akismet key before allowing sharing by email.
+* WooCommerce Analytics: Fixed PHP warning when attemping to get a list of plugins.
+
+= 6.1 =
+
+* Release date: May 1, 2018
+* Release post: https://wp.me/p1moTy-7Sj
+
+**Major Enhancements**
+
+* WordAds: Introduced shortcode for inline Ad placement.
+* WordAds: Added support for the ads.txt file.
+
+**Enhancements**
+
+* Dashboard: We improved the styles of status numbers so it doesn't look like floating.
+* JSON API: Added support for Google My Business integration available on WordPress.com.
+* Masterbar: We removed the Next Steps link from the Account sidebar.
+* Publicize: Let the user know that we are going to send emails to subscribers and publicize to the different accounts.
+* Settings: Added "Privacy Information" links to each Jetpack module/feature card.
+* Shortcodes: Mixcloud shortcode now uses oEmbed.
+* Stats: Added a new filter jetpack_honor_dnt_header_for_stats, which if enabled would not track stats for visitors with DNT enabled.
+* Sync: Removed requirement for gzencode.
+* Widgets: always load script via HTTPS for Gravatar Hovercards.
+
+**Improved compatibility**
+
+* Social Icons Widget: Improved support on screen reader text for themes that do not provide support out of the box.
+* Sharing: Removed the sharing and like display functionality from Cart, Checkout, and Account WooCommerce pages.
+
+**Bug fixes**
+
+* Admin Page: We fixed the internationalization of the plans page.
+* Ads: We fixed a problem that impeded Premium Plan customers to activate Google Analytics.
+* Auto Updates: We fixed a warning being thrown due to a bad concatenation of strings.
+* General: Fixed a warning that was being logged due to attempting to use in_array() over a variable that didn't always contain an array.
+* General: Fixed Warning: count(): Parameter must be an array or an object that implements Countable showing on PHP 7.x.
+* JSON API: Fixed internationalization on embed endpoint.
+* Theme Tools: Show featured images in WooCommerce pages when Display on blog and archives is turned off for Themes that support this feature.
+* Publicize: Avoid adding Publicize post meta when a post transitions to publish and it is not a publicize-able post type.
+* Settings: Fixed the icon representing the minimum plan needed for SEO and Google Analytics features.
+* Slideshow: Fixed an invalid argument supplied for foreach() warning.
+* SSO: We fixed the name of a filter which contained a typo before. The filter is now named: `jetpack_sso_auth_cookie_expiration`.
+* SSO: Fixed some cases where we were not handling secure cookies for sites running over https.
+* Sync: Fixed Warning: Invalid argument supplied for foreach().
+* Sync: Fixed Warning: Warning: json_encode(): recursion detected.
+* WooCommerce Analytics: fixed broken Remove From Cart link.
+
+= 6.0 =
+
+* Release date: April 3, 2018
+* Release post: https://wp.me/p1moTy-7xM
+
+**Major Enhancements**
+* Admin Page: Introduced a new Privacy admin page linked at the bottom of the Jetpack dashboard.
+* Admin Page: Introduced a Privacy toggle that allows the user to disable event tracking.
+* Widgets: Added new Social Icons widget and deprecated old Social Media Icons widget.
+
+**Enhancements**
+
+* Activity Log: Started syncing comment untrashed and comment unspammed events.
+* Admin Page: Added inline module settings for plan welcome page.
+* Admin Page: Removed Javascript patterns previously used in the Admin Page that should improve performance lightly (bind pattern).
+* Admin Page: Made Jetpack Monitor setting management easier by adding a simple toggle.
+* Admin Page: Moved the button for closing the Jumpstart modal closer to the dialog so it's more visible.
+* Admin Page: Updated the "install and activate" link in the Backups card to be a functional link matching the "Set up" button.
+* Admin Page: Updated notices style to be more accessible.
+* Admin Page: We now show a link to see all plans on small screens.
+* Admin Page: Settings in Jetpack dashboard now feature contextual help and a link to learn more about it.
+* Ads: Added site id to head meta.
+* Comments: Improved accessibility of comments form by adding title attributes.
+* Connect: Removed account creation links from below the Set Up Jetpack buttons.
+* General: Show correct available status in Jetpack modules list if module is not supported by current plan.
+* General: Removed holiday snow module.
+* General: Return error in wp-cli if activating a module that is not supported by the current plan.
+* Google Translate Widget: Made sure the widget is responsive by default.
+* JITM: We now allow specifying that a jitm can be opened in a new window, or the same window.
+* JITM: We now don't use all caps for buttons text.
+* Likes: Removed Likes from Jumpstart.
+* Likes/Sharing: Moved metabox in post editor to the right side for a better fit.
+* Masterbar: Made the Sign Out link in the Master always log you out from WordPress.com.
+* Publicize: Made styling of Publicize more consistent with wp-admin.
+* Protect: Started blocking XML RPC requests when they get marked as blocked by Protect.
+* Search: Made the Search widget available whether or not Extra Sidebar Widgets is enabled.
+* SEO Tools: Removed SEO Tools from Jumpstart
+* Shortcodes: We now load Twitters widget.js over https.
+* Subscriptions: We've made it a better experience if you try to subscribe to a site you are already subscribed to.
+* Sync: Stopped syncing personal data coming from WooCommerce orders.
+* VideoPress: Default to grid view when linking to upload videos
+* Warm Welcome: Added Search to the features listed on the Warm Welcome dialog for Professional Plan.
+* Widgets: Added rel=noopener attribute to links in the Display WordPress Posts widget if set to open in a new window.
+
+
+**Improved compatibility**
+
+* bbPress: Markdown support added for bbPress CPTs.
+* PHP 7.1: Fixed an error coming from one of our json-api endpoints.
+
+**Bug fixes**
+
+* Admin Page: Fixed Dashboard connection card from showing text that overflows the card.
+* Admin Page: Fixed directory separator character used when displaying the site URL on the disconnect dialog.
+* Admin Page: Fixed an issue by which clicking the back button on a page visited after the Admin Page would result in the Admin Page being rendered with cached data.
+* Admin Page: Don't show a Set Up button when searching for modules that are inactive in Jetpack Settings page. The Set Up button is meant for paid features coming from plugins.
+* Admin Page: Make it clear when tracking begins in the connetion dialog.
+* Admin Page: Hide the date range tabs when the initial dialog is shown.
+* Admin Page: Fixed the positioning of popovers in the Jetpack Settings page.
+* Admin Page: Fixed a bug with the Ads settings toggle.
+* Admin Page: Fixed a display issue for the custom user capability "jetpack_connect".
+* Admin Page: Made sure translations are properly applied to several phrases.
+* Connection Banner: Updated style to better fit wide screens.
+* Connection Banner: Added illustration SVGs.
+* Contact Form: Fixed width style of input for Website address.
+* Google Analytics: fix PHP notice on search pages.
+* Infinite Scroll: Fixed issues where the first was being duplicated on scroll.
+* Likes: Made manually enabled likes remain being likeable if Likes are enabled for all posts
+* Masterbar: Fixed a javascript error that would pop up with the Grammarly extension enabled on Chrome macOS.
+* Search: Added default values for the Search widget so it can be added from the Customizer.
+* Settings: Fixed overflow/overlap when there are many ignored phrases in spelling options.
+* Settings: Updated SEO/analytics links to avoid unnecessary redirects.
+* Stats: Fixed column spacing styling issues in WP Dashboard box for Jetpack stats.
+* VaultPress: Remove menu item that links nowhere when Rewind is enabled.
+* Widgets: Fixed issue with custom URL choice and selective refresh in the EU Cookie Law widget.
+* WooCommerce Analytics: Fixed PHP warning coming from str_replace usage.
+* WooCommerce Analytics: Started tracking all possible ways to add a product to a cart.
+
+== 5.9 ==
+
+* Release date: March 6, 2018
+* Release post: https://wp.me/p1moTy-7mW
+
+**Major Enhancements**
+
+* WooCommerce Analytics: Added a new module for WooCommerce analytics that will use Jetpack's analytics functionality to help you track activity on your WooCommerce store.
+* Custom Content Types: Added support for excerpts on Testimonial and Portfolio.
+
+**Enhancements**
+
+* Activity Log: Improved the way we show failed login attempts in Jetpack's Activity Log.
+* Admin Page: We now hide settings for Lazy Images and Photon in the Admin page when the modules are not enabled due to being filtered out by jetpack_get_available_modules.
+* Admin Page: Now we only show the dismissal button in Apps card of the Jetpack Dashboard for admin users.
+* Build: Added a pre-commit hook for linting the Jetpack Admin Page source code. This aids in finding common syntax and style problems before having to wait for automated tests to run.
+* JSON API: We removed an obsolete endpoint for updating invites.
+* Onboarding: Added the ability to configure the country for a business address the using the Onboarding functionality of Jetpack.
+* Onboarding: Added the ability to enable the stats module when using the Onboarding functionality.
+* Onboarding: We now delete the onboarding token when the site gets connected.
+* Jetpack Start: Updated scripts for partners allowing to pass a tracking ID when provisioning or cancelling a plan which will help in debugging.
+* Jetpack Start: Improved the documentation for partners so they're now able to get them right on the Jetpack's Github repository under the docs/partners directory.
+* Plans: Correctly forward the client IP address for currency localization.
+* Plans: Updated the copy-text on Jetpack's Admin page for plans to be more concise on the features of each plan.
+* REST API: Added a plans endpoint to Jetpack's REST API to better handle the features of each Jetpack plan internally.
+* Search Implicitly activate Jetpack Search when attempting to add the Jetpack Search widget.
+* Search: Updated the Jetpack Search settings card to be more helpful in setting up the widget.
+* Search: We made the "Add Jetpack Search Widget" link in the Search module settings card open the widgets section of the customizer.
+* Search: Move any active search widgets to the inactive list if you disable the search module.
+* Search: Only log mysql and ES query times that are less than 60 seconds. There are some outliers that mess up our stats.
+* Sync: Improved the way widget titles are synchronized to WordPress.com servers when widgets are saved or updated.
+* Twitter Cards: Added new jetpack_twitter_image_default filter to allow themes and plugins to customize twitter:image when no suitable image is found automatically.
+* We updated the way we handle Jetpack's green color in out stylesheets for better compatibility with Jetpack's new logo.
+
+**Improved compatibility**
+
+* Admin Page: Jetpack's Admin Page javascript code is now fully compatible with React 16.
+* JSON API: Updated the modules endpoint Jetpack's JSON API to reply with a new property `override` that indicates if a module was either enabled or disabled by a filter.
+* Lazy Images: Updated the library used as IntersectionObserver for Lazy Images. We now use the W3C IntersectionObserver polyfill.
+* Lazy Images: Jetpack now allows the lazy images module to skip images with the skip-lazy css class or any given class of your choice by using the jetpack_lazy_images_blacklisted_classes filter.
+* Masterbar: Updated the sign out button behavior of the Masterbar to not sign you out of WordPress.com when you sign out of your site for regular Jetpack sites.
+* REST API: Updated the modules endpoint in Jetpack's REST API to be aware of modules that have been filtered through option_jetpack_active_modules allowing for better compatibility with custom Jetpack installation where the administrator decides to filter out specific Jetpack modules.
+* Sync: Added the jetpack_sync_action_before_enqueue action that's done when anything gets enqueued before being synchronized to WordPress.com servers.
+
+**Bug fixes**
+
+* Admin Page: Removed all linting warnings for the JS code of the Admin page. These were only shown in development builds.
+* Connect: Fixed an issue that sometimes resulted in a notice being shown about another user already having connected a Jetpack site when attempting to connect your site to WordPress.com
+* General: Added suppress_filters param to get_posts / get_children function calls.
+* Markdown: Updated WordAds code to not use create_function which is getting deprecated in PHP 7.2.
+* Sync: Fixed a problem in Jetpack Sync code when trying to get property of non-object in the post syncing file.
+* Sync: Stopped synchronizing the sitemap post types to WordPress.com servers as it was an issue given the size of these.
+* Tracks events: Track events are logged now only if the user has accepted ToS and not just if Jetpack is connected.
+* Widget Visibility: Added a decodeEntities function in widget-conditions.js to handle entity decoding for the minor conditions dropdown.
+* WordAds: Updated WordAds code to not use create_function which is getting deprecated in PHP 7.2.
+
+= 5.8 =
+
+* Release date: February 6, 2018
+* Release post: https://wp.me/p1moTy-731
+
+**Major Enhancements**
+
+* [Lazy Images](https://jetpack.com/support/lazy-images/): after a Beta
+period, you can now enable this new feature from Jetpack > Settings in your
+dashboard.
+* [Elasticsearch-powered
+search](https://jetpack.com/features/design/elasticsearch-powered-search/):
+also out of Beta! We've improved the way data is indexed behind the scenes,
+and made changes to the Search widget and its filters. (Elasticsearch is a
+trademark of Elasticsearch BV, registered in the U.S. and in other countries.)
+
+**Enhancements**
+
+* Comment moderation tools: moderation emails now point to WordPress.com when
+using the `edit_links_calypso_redirect` option.
+* Custom CSS: add CSS Grid Layout support.
+* Dashboard: update list of features available in Paid plans.
+* Dashboard: improve the display of notices inside the Jetpack dashboard.
+* Dashboard: update content displayed in the Jetpack dashboard when not
+connected to WordPress.com.
+* Development mode: improve the display of the development notice.
+* General: add a new filter, `jetpack_active_modules`, allowing site owners to
+filter the list of active modules.
+* Notices: add rel tags to notice links to avoid issues when links open in a
+new window.
+* Onboarding: add functionality for saving Business Address in the Contact
+Info widget.
+* Onboarding: save site type during site setup process.
+* Onboarding: enable loading of specific modules when using the Onboarding
+process.
+* Post Images: allow passing size when searching for images in HTML.
+* REST API: update the plugin installation process to use a new library.
+* REST API: allow changing the number of posts displayed in the RSS feed, and
+whether feeds display full text or a summary.
+* REST API: simplify our invites endpoint.
+* Sharing: make sure the Whatsapp button works on mobile and on desktop.
+* Sharing: add new filter, `wp_sharing_email_send_post_subject`, to allow
+modifying the email sharing subject line.
+* Shortcodes: update the GettyImages shortcode to use the new format required
+by GettyImages.
+* Site Settings: add support for site language and timezone settings.
+* Sync: improve synchronization of user actions, theme and plugin edits /
+updates, post status, updates on Multisite networks, Protect events, and
+WooCommerce's meta data.
+* WordAds: enable the Ads in the header by default.
+* WordAds: add filters so site owners can control the display of the ads via
+code as well.
+
+**Improved compatibility**
+
+* Lazy Images: fix issues with the Gazette theme.
+* Open Graph: add Open Graph Metabox to the list of conflicting plugins.
+* Masterbar: fix incompatibility with BeaverBuilder plugin.
+* PHP 7.2: fix issues when running Jetpack with PHP 7.2.
+
+**Bug fixes**
+
+* Carousel: fix PHP Notice with images using custom meta.
+* Dashboard: make sure all links to WordPress.com point to the right site's
+settings on WordPress.com.
+* Dashboard: update links to the plugin interface on WordPress.com to load the
+full plugin management page.
+* General: fix images shown in the dashboard when Jetpack is installed in a
+directory different than `jetpack`.
+* Lazy Images: make sure Lazy Load can be triggered even when images are added
+to the content very late.
+* Stats: make sure the Stats script is XHTML compliant.
+* Widgets: Mailchimp - avoid conflicts with jQuery UI.
+
+= 5.7.1 =
+
+* Release date: January 16, 2018
+* Release post: https://wp.me/p1moTy-7aS
+
+**Bug Fixes**
+
+* Protect: Fixed the math problem fallback for logging into Multisite installations.
+* Settings: Made sure that the Security tab is no longer constantly updating the displayed information.
+
+= 5.7 =
+
+* Release date: January 2, 2018
+* Release post: https://wp.me/p1moTy-6FR
+
+**Enhancements**
+
+* Added ability to create revisions of Portfolio Projects.
+* Users hosting their sites with our Pressable partner who have Rewind access can now jump from the new Activity card in the Jetpack dashboard to the Activity Log in WordPress.com and restore or download backups for the site.
+* Comments: Edit links for comments in the frontend can redirect to calypso if the Jetpack option `edit_links_calypso_redirect` is enabled.
+* Protect: Updated the styling of the Protect page for recovering access to your site when you're locked out of it.
+* Search: Improved the UI for customizing the Search widget.
+
+**Improved compatibility**
+
+* Comments: Updated our filtering behavior for Jetpack comments so other plugins appending html to the comments section are able to do it instead of being filtered out by Jetpack.
+* Widgets: We updated Goodreads URLs to support https schema.
+* Masterbar: We now hide the Masterbar settings card in Jetpack’s Admin Page for sites that are set to always show the Masterbar.
+* Lazy Images: Added a callback for processing image attributes array when attempting to lazy load images are loaded via `wp_get_attachment_image`.
+* Search: Added hooks to the search filters widget so that other plugins/themes can hook in and change its output.
+
+**Bug fixes**
+
+* REST API: Added a check for avoiding a fatal error when attempting to include Akismet class files in case the Akismet plugin files are present but the permissions on the files there are set to be not readable
+* Markdown: Fixed bug where code inside shortcodes wasn't correctly restored from the hash.
+* Search: Fixed the link that acts as a month and year filter removal toggle.
+
+= 5.6.1 =
+
+* Release date: December 14, 2017
+* Release post: https://wp.me/p1moTy-6Jk
+
+**Security Improvements**
+
+* Contact Forms: Hardened security in Contact Form processing.
+
+**Enhancements**
+
+* Sharing: Bumped the character limit to 280 when sharing a post to Twitter.
+
+**Bug fixes**
+
+* Widget Visibility: Fixed a bug that disabled "saving" the widget when removing a Widget Visibility rule.
+
+= 5.6 =
+
+* Release date: December 5, 2017
+* Release post: https://wp.me/p1moTy-6zt
+
+**Major Enhancements**
+* Google Analytics: Add support for universal analytics for WooCommerce.
+* Performance: minify all JavaScript files used in the plugin.
+* Performance: add new Lazy Images module.
+* Protect: add new mechanism allowing you to send yourself an email with a
+link to the form when you are locked out of your site.
+
+**Enhancements**
+* Custom CSS: add new set of font properties that can be used in the CSS
+editor.
+* Photon: do not remove `width` and `height` attributes from image tags when
+known.
+* Sitemaps: add CLI commands to purge and built the sitemaps.
+* Sitemaps: only display the reporter log success messages if
+`JETPACK_DEV_DEBUG` is defined.
+* WordPress.com API: add new endpoints to allow for better comment management
+in third party interfaces like WordPress.com.
+* WordPress.com Toolbar: prevent dns prefetching for logged out users.
+
+**Improved compatibility**
+* Stats: remove function deprecated in PHP 7.2.
+
+**Bug fixes**
+* Comment Likes: make sure Like text is properly translated.
+* General: only load stats code when necessary.
+* Related Posts: allow site owners to exclude multiple blog posts from the
+list of Related Posts.
+* Sharing: remove inline JavaScript used in the email sharing form.
+* Search: Maintain ordering of the search filters in the widget.
+* Sync: avoid PHP notices during the synchronization process.
+
+= 5.5.1 =
+
+* Release date: November 21, 2017
+* Release post: https://wp.me/p1moTy-6Bd
+
+**Bug fixes**
+* In Jetpack 5.5 we made some changes that created errors if you were using other plugins that added custom links to the Plugins menu. This is now fixed.
+* We have fixed a problem that did not allow to upload plugins using API requests.
+* Open Graph links in post headers are no longer invalid in some special cases.
+* We fixed warnings happening when syncing users with WordPress.com.
+* We updated the way the Google+ button is loaded to match changes made by Google, to ensure the button is always displayed properly.
+* We fixed conflicts between Jetpack's Responsive Videos and the updates made to Video players in WordPress 4.9.
+* We updated Publicize's message length to match Twitter's new 280 character limit.
+
+= 5.5 =
+
+* Release date: November 7, 2017
+* Release post: https://wp.me/p1moTy-6rk
+
+**Major Enhancements**
+
+* Jetpack is now fully compatible with WordPress's [new Gallery Widget](https://make.wordpress.org/core/2017/09/25/introducing-the-gallery-widget/). Your old Gallery widgets powered by Jetpack will switch to the new Widget when you update to WordPress 4.9.
+
+**Enhancements**
+* We have improved the performance when loading the Jetpack Settings in the dashboard by optimizing the number of calls made when loading the page.
+* We have updated the plugin to do a better job of cleaning up after itself whenever you decide to remove Jetpack from your site.
+* We made some changes to reduce the number of connection issues that may happen on a site when switching from HTTP to HTTPs.
+* We made some performance improvements to the Jetpack dashboard interface, to make sure your options and settings are loaded faster there.
+* Error messages are also better in the Jetpack Dashboard; whenever you can't update settings, Jetpack will provide you with more information about why.
+* We improved the Jetpack update process to make sure updating Jetpack does not stress your database during it, even on high-traffic sites.
+* The next version of WordPress, 4.9, will be released very soon and will include [a lot of changes to its code editors](https://make.wordpress.org/core/2017/10/22/code-editing-improvements-in-wordpress-4-9/). Jetpack's Custom CSS will be fully compatible with the new editors and their syntax highlighting feature.
+* We also made changes to make sure Jetpack was fully compatible with the [role and capability changes](https://make.wordpress.org/core/2017/10/15/improvements-for-roles-and-capabilities-in-4-9/) in WordPress 4.9.
+* We have made some performance improvements to the Carousel feature.
+* Contact Form: do not process shortcodes in widgets when WordPress itself does, starting in 4.9.
+* Contact Form: we have improved the "website" field to display better error messages when you don't supply a URL. We have also improved the look of the date picker for the date field.
+* Contact Form: avoid duplicate slashes when loading editor style.
+* Masterbar: update the "Plugins" menu item to match the updated design on WordPress.com.
+* Open Graph: do not display images smaller than Facebook's required size.
+* Sharing: use Google's minified libraries to improve performance when loading Google buttons.
+* Sharing: update Open Graph Image tags appearing on the home page to offer better alternatives based on your site settings in Appearance > Customize.
+* We improved the way sitemaps are built so they do not consume too much memory when they are generated.
+* WP.me Shorlinks: those links will now always use HTTPS.
+* Spellchecker: we improved the admin interface to make it more clear when adding ignored phrases and saving them.
+* Subscriptions: we added a filter so third party developers can track comment subscription activations.
+* Sync: synchronize plugin action links to add that information to WordPress.com.
+* Sync: improvements to better track theme and widget changes.
+* VideoPress: we removed Jetpack version locking for directly embedded VideoPress videos to ensure all users receive the newest version of the player.
+* We added a new filter (`jetpack_google_translate_widget_layout`) to the Google Translate Widget to allow you to change its layout.
+* WordPress.com REST API: improve comment management for all roles, including post authors.
+* WordPress.com REST API: allow site owners to manage comments on attachment pages from WordPress.com.
+* WordPress.com REST API: improve the response from the API when WordPress' autoupdates are disabled.
+
+**Improved compatibility**
+* You can now use Jetpack's contact form and Yoast SEO's Focus keywords on the same page without any issues in the editor.
+* Top Posts Widget: avoid Fatal Errors when the widget is used on a site using WPML, and when a popular post cannot be found by WPML.
+* Sync: add more Custom Post Types from third-party plugins to the list of things we do not synchronize with WordPress.com, to improve sync performance.
+* Sharing: since [Press This is now a plugin and not part of WordPress itself](https://make.wordpress.org/core/2017/11/02/press-this-in-4-9/), we removed the Press This sharing button if you are not using the plugin.
+
+**Bug fixes**
+* We now avoid displaying notices to user roles that cannot benefit or act based on the info in the notices.
+* Gravatar Hovercards: avoid PHP Notices when the user info is an object.
+* Infinite Scroll: avoid PHP notices when a site customizes galleries thanks to the `post_gallery` filter.
+* Mailchimp: make sure subscription forms can still be embedded in posts and pages.
+* Mailchimp: do not require the use of the shortcodes feature to use the Mailchimp widget.
+* Mailchimp: fix issue where Mailchimp form code could not be added to the Mailchimp widget.
+* Masterbar: avoid JavaScript errors by always loading jQuery.
+* Post By Email: do not display any content in the email address field if no email address has ever been set before.
+* Publicize: avoid errors when DOMDocument is not available.
+* Publicize: we now hide the feature activation toggle if you are not allowed to manage Jetpack features.
+* Search: make sure module cannot be activated when the site does not use a Plan.
+* SEO Tools: do not output any custom meta tags if another SEO plugin is already active.
+* Sharing: make sure Twitter Cards can be displayed even when a post does not include a title.
+* Sharing: fix alignment of sharing buttons in the admin preview when using custom sharing buttons.
+* Sitemaps: wait a minute before to generate sitemaps when the feature is activated, to avoid performance issues.
+* Sync: avoid synchronization issues on Multisite networks using custom domains.
+* Top Posts Widget: display the default title when it is set to empty.
+* Milestone Widget: make sure the widget is displayed properly and can easily be translated into other languages.
+* Verification Tools: avoid notices when saving changes on a Multisite network admin page.
+* VideoPress: avoid missing file warning in the editor when using an RTL language.
+* Upcoming events Widget: avoid PHP notices on sites using a custom timezone setting.
+* WordPress.com REST API: avoid errors when installing plugins via the WordPress.com API.
+
+= 5.4 =
+
+* Release date: October 3, 2017
+* Release post: http://wp.me/p1moTy-67V
+
+**Major Enhancements**
+* Multiple improvements to the connection process, to allow more people to use the Jetpack plugin, even on very specific server configurations.
+* Add a new Welcome screen to guide site owners after they have purchased a Jetpack plan.
+
+**Enhancements**
+* Add Schema.org markup to the Contact Info Widget.
+* Add a new "Date" field to the Contact Form.
+* Do not show any update notices when in [development mode](http://jetpack.com/support/development-mode).
+* Improve our documentation to help contributors set up a unit testing environment.
+* Avoid conflicts between Jetpack's Infinite Scroll and other Infinite Scroll plugins.
+* Improvements to the WordPress.com REST API to avoid issues when interacting with your site's categories and tags on WordPress.com.
+* Allow third party plugin and theme authors to add new menu items to the WordPress.com toolbar.
+* Improve the Content Options panel displayed in the Customizer with certain themes.
+* Add architecture for the Jetpack Search feature, available for Jetpack Professional users.
+* Simple Payments: improve the display of the payment items when used on your site.
+* Ensure a proper display of the Recipe shortcode on sites using an RTL language.
+* Improve the display of the Facebook posts, images, and all other Facebook embeds in your posts.
+* Synchronize the author information for all published posts.
+* Record how Jetpack was discovered and activated to better understand how site owners first discover Jetpack.
+* Improve the display and options offered with the Milestone Widget.
+
+**Bug fixes**
+* We fixed layout issues appearing in the admin interface for IE11 users.
+* Comment Form: avoid whitespace sometimes appearing below the form with some themes.
+* Contact Form: avoid errors in the post editor on sites using RTL languages.
+* Toolbar: always display the Toolbar when it's active, regardless of other admin bar settings.
+* Widget Visibility: make sure rules are correctly migrated from the old Jetpack image widget to the new WordPress Image Widget.
+* Avoid errors showing that Jetpack is out of date on WordPress.com, when running a Multisite network.
+* WP CLI: avoid warnings when using the `wp jetpack protect whitelist list` command to list the whitelisted IP addresses in the Protect feature.
+* Avoid displaying raw HTML in the Stats Configuration screen.
+* Comment edits are reflected properly in wordpress.com.
+
+= 5.3 =
+
+* Release date: September 5, 2017
+* Release post: http://wp.me/p1moTy-5Xv
+
+**Major Enhancements**
+* Full PHP 7.1 compatibility.
+* It's now possible to preview your site within WordPress.com.
+
+**Enhancements**
+* The Ads feature now gives you more options and control over the ads displayed on your site.
+* Increased performance in the admin by cutting back on unnecessary requests.
+* Loading comment avatars from Facebook and Twitter through a more secure https.
+* Admin UI is much friendlier on initial activation when there are no stats to display.
+* You're now able to stop VideoPress from looping a video during autoplay through the shortcode.
+* Made some optimizations to the Jetpack connection process which means connecting your site more is more reliable.
+* The EU Cookie Law widget got some styling improvements and looks better in any theme.
+* There's a new Jetpack CLI command to allow testing of the Jetpack connection.
+* Added the Likes and Monitor features to our recommended features list, making it easier to activate for new sites.
+* Improvements made that makes sure we have the most up-to-date version of your site when managing from WordPress.com.
+* Added a link to view your Comments in the WordPress.com toolbar.
+* Lots of minor design improvements to the Jetpack admin area.
+* We've found a few places where we were able to optimize the loading of css files.
+* Removed the Omnisearch feature.
+
+**Bug fixes**
+* Fixed compatibility issues with plugins using TinyMCE.
+* Contact Form submission emails have been fixed for sites hosted on SiteGround.
+* Updating WordPress.com themes will no longer have any problems.
+* The Sitemaps feature will no longer error with posts/images with special characters in the title.
+* There are no more conflicts with the ACF plugin when adding a new custom field.
+* Fixed a bug that would cause some plugins to throw warnings with the Shortcode feature.
+* We're no longer loading a font on the front-end for the Likes feature, which will also have some performance benefits.
+* The Jetpack admin UI had some bugs that were causing some features to not display the correct active status, which are squashed now.
+* Cleaned up our markup to avoid XHTML validation errors.
+* Brought back a filter for the Widget Visibility feature that was accidentally removed.
+* Managing your comments and comment authors more reliable from WordPress.com.
+
+
+= 5.2.1 =
+
+* Release date: August 2, 2017
+* Release post: https://jetpack.com/?p=22686
+
+**Bug fixes**
+* Solves an issue that caused widgets to lose their content when saved in WP Admin or Customizer.
+
+= 5.2 =
+
+* Release date: August 1, 2017
+* Release post: https://jetpack.com/?p=22509
+
+**Major Enhancements**
+* Contact Forms now sports a fancy new interface that allows you to visually compose your form in the editor.
+* We have a new and slick way to showcase and explain the features we recommend to activate to new users.
+
+**Enhancements**
+* Reduced 500kb from plugin zip file, which means faster updates.
+* Refactored and reduced code for Comment Likes so it's faster and lighter.
+
+**Bug fixes**
+* An inconsistency experienced in WordPress.com dashboard when Related Posts settings were set in the local site's WP Admin is now fixed.
+* Fixed a 404 when loading Open Sans font from a stylesheet plus now it's only enqueued if it will be used.
+* Solve PHP warnings when Image widget wasn't migrated.
+
+= 5.1 =
+
+* Release date: July 5th, 2017
+* Release post: https://jetpack.com/?p=20888
+
+**Major Enhancements**
+* You and your readers can now show appreciation to particularly clever comments with the new Comment Likes feature.
+
+**Enhancements**
+* Quickly visit your current site's front-end directly from the Masterbar's new "View Site" item.
+* Site data fetch from /me/sites REST API endpoint now includes `blog_public` in the list of returned options.
+* The Flickr widget now automatically displays images in a grid if there's enough room.
+* E-mail sharing is now disabled by default unless it's explicitly enabled by a filter or Akismet is active.
+
+**Compatibility Improvements**
+
+* Updated instructions in Flickr widget to reflect recent changes to the Flickr UI.
+
+**Bug fixes**
+
+* EU Cookie Law Banner cookie no longer cached.
+* WP Admin menu can now be accessed in mobile when Masterbar is displayed.
+* We now sync the `order_id` for `order_items` in older WooCommerce versions.
+* UI now handles VaultPress connection or registration problems gracefully.
+* Photon now works correctly with images uploaded before WordPress 2.7.
+
+= 5.0 =
+
+* Release date: June 6th, 2017
+* Release post: http://wp.me/p1moTy-5hK
+
+**Enhancements**
+
+* Several changes to the Jetpack dashboard and notices: alignment tweaks, code refactor, text simplification, and more.
+* Changes to the communication layer between your site and WordPress.com, to improve performance and allow you to do more to manage your site from WordPress.com.
+* Social menu gets icons for Etsy, Meetup, 500px, and Goodreads.
+* Jetpack data sync now better supports WordPress updates, themes changes, widgets, and multisite networks.
+* Video is updated to be fully compatible with the upcoming Media Widget.
+* Force secure WordPress.com API requests for request body, remove deprecated stats methods, and add new endpoints for post listing and user invitations.
+* Jetpack's Command Line tools can now output information about the primary Jetpack site owner. Try `wp jetpack status`!
+* Custom CSS now supports the `animation-fill-mode`, `fill`, and `stroke` properties.
+* Remove the "Menus" item from the WordPress.com toolbar for parity with the toolbar on WordPress.com.
+* Improve the display of the Omnisearch results page on sites using an RTL language.
+* Trim any white space when adding new email address in the Contact Info Widget.
+* Improve the look of your recipes in search engine result pages, when you use the Recipe shortcode.
+
+**Compatibility Improvements**
+
+* Improve the connection process for end users and hosts.
+* Improve compatibility of Jetpack data sync with WooCommerce and Pet Manager plugins.
+* Make sure Jetpack's SEO Tools don't conflict with other SEO plugins that may already be active on the site, like Yoast SEO or All In One SEO Pack.
+
+**Bug Fixes**
+
+* Add a "Set Up" button when a Personal plan is purchased, but VaultPress isn't active yet.
+* When the Ads feature is active, do not display Ads in RSS feeds.
+* Comments do not use Photon for Facebook and Twitter avatars and now avoid non-secure warnings when submitting comments on a HTTP site in Safari.
+* Contact form emails are now sent in a way that ensures they are correctly rendered as HTML.
+* Properly print the full list of modules when using the sync command in Jetpack's Command Line Interface (CLI).
+* Avoid errors when reordering a lot of Restaurant menu items at once.
+* Add a mechanism to detect broken connection states and resolve them.
+* Autosaves can now be restored as Markdown.
+* Photon no longer conflicts with Facebook's CDN, local images, and plugins that customize reponsive images.
+* Avoid potential PHP notice in Publicize.
+* Fix bad jQuery selector in Presentations shortcode.
+* Avoid fatal errors for Social Links on sites running PHP 7.1.
+* Properly escape button attribute in spellchecker.
+* Avoid PHP notices for stats on some sites when user roles are not attributed properly.
+* No longer attempt to sync options that do not exist and avoid fatal errors when de/activating plugins.
+* Avoid errors when Social Menu functions have already been defined in the theme or in another plugin.
+* VideoPress media items now always return their unique ID, and do not trigger any PHP notice.
+* Fix style of the EU Cookie Law Widget on themes with specific positioning.
+* Use correct time constant to define an hour in Upcoming Events Widget.
+* Avoid HTML encoding issues in sitemaps.
+
+= 4.9 =
+
+* Release date: May 2nd, 2017
+* Release post: http://wp.me/p1moTy-4Rl
+
+**Major Enhancements**
+
+* New "EU Cookie Law Banner", Flickr, and "Internet Defense League" widgets.
+
+**Slightly Less Exciting Enhancements**
+
+* Success notices are automatically dismissed after a short period.
+* Removed unused code from "My Jetpack" interface and deprecated an XML-RPC method.
+* Contact Form now adds display names to email addresses in the `To` header.
+* Added an updated multiple unit tests increasing code coverage.
+* Development mode now also shows module list.
+* Updated the list of locales available in Jetpack.
+* Plugin auto-updates only triggered from WordPress.com and now trigger WordPress' maintenance mode.
+
+**Performance Improvements**
+
+* Record comment content modifications and moderation events to make sure comments are always up to date on WordPress.com.
+* Sync post deletions, changes to sidebar, user events (addition, removal, and update) and theme installation.
+* We now distinguish between a new and an updated attachment.
+* Sync plugin and theme names when a related event is triggered including theme updates.
+
+**Compatibility Improvements**
+
+* Protect avoid conflicts with other plugins hooking into the log in form.
+* Contact Form not auto-activated when Ninja Forms is active.
+* WordPess.com REST API now allows `HTTP PUT` requests.
+
+**Bug Fixes**
+
+* Fixed wording in Post By Email button when no email address has been generated.
+* Fixed a notice in the subscription widget in PHP 7.1
+* Properly display VaultPress notices in the Jetpack dashboard.
+* VideoPress now included in search results for "video" and fixed positioning of search icon on mobile screens.
+* Protect supports IPv6 addresses properly.
+* Dashboard avoids API requests being cached on some hosts and avoids errors when Spellchecker is inactive.
+* Contact Form message content type is now set properly to restore compatibility with email plugins.
+* Ads not displayed in the portfolio projects custom content type.
+* Display all sites available in a network, even on large multisite installations.
+* Featured Image is always used in tweets posted via Publicize.
+* Avoid fatal errors when the exclusion parameter in Related Posts is not a string.
+* Allow the removal of all custom title settings in the SEO feature.
+* Make sure images are not distorted when Tiled Galleries uses Photon.
+* Avoid PHP warnings and errors in the Stats dashboard on Multisite.
+* Avoid errors when the Jetpack plugin is deleted.
+
+= 4.8.2 =
+
+* Release date: April 7th, 2017
+* Release post: http://wp.me/p1moTy-4P0
+
+**Bug Fixes**
+
+* Fixed a bug that prevented activating/deactivating of some features in PHP versions below 5.4.
+* Removed an unused function that was also incompatible with PHP versions below 5.4.
+* Fixed a bug that was causing a blank Jetpack admin area.
+
+= 4.8.1 =
+
+* Release date: April 5th, 2017
+* Release post: http://wp.me/p1moTy-4N5
+
+**Bug Fixes**
+
+* An incompatibility with PHP versions lower than 5.4 was introduced in the last release, causing a fatal error and we've immediately fixed this.
+* Sitemaps: Some plugins were relying on a function that was removed in the last release, which has been fixed.
+* General: Clicking on the info icon in the settings area will no longer jump to the top of the page.
+* General: The Anti-spam card will always display the correct status in the Jetpack dashboard.
+
+= 4.8 =
+
+* Release date: April 4th, 2017
+* Release post: http://wp.me/p1moTy-4gA
+
+**Major Enhancements**
+
+* Easier to navigate Jetpack's feature settings in your dashboard and WordPress.com.
+* New WordPress.com Toolbar provides quick access to site management, stats, and other services.
+* New MailChimp Subscribe Popup widget.
+* Sitemaps are faster and now support sites with a very large amount of posts.
+* Contact Form now has a plain-text alternative and better avoids spam filters.
+* Debug form includes extra information to better prioritize your support requests.
+* Photon can now be used within the dashboard, and supports bbPress topics and replies.
+
+**Slightly Less Exciting Enhancements**
+
+* Improved previously confusing wording in Stats dashboard, and Featured Content options.
+* You can now embed Apple Keynotes straight from icloud.com in your posts and pages.
+* Changed Infinite Scroll button text on taxonomy page and added a new filter to short-circuit the `is_last_batch()` method.
+* Open Graph now uses transients to save image IDs.
+* You can now use full URLs in the Social Media Icons widget.
+* Milestone widget now allows custom links to open in a new window.
+* VideoPress videos can be used as headers in themes that support it, like Twenty Seventeen.
+* Extracted the timezone offset method from the Upcoming Events widget so it can be used by other features.
+
+**Performance Improvements**
+
+* Database load is reduced during updates on large sites with multiple servers by retaining hashes for current and current-1 versions.
+* Disk storage is reduced on large multisite networks by storing the `jetpack_file_data` option in the `wp_sitemeta` table.
+* Jetpack plan data now uses the WordPress.com REST API.
+* Slovakian language files now rely on WordPress.org's language packs.
+
+**Accessibility Improvements**
+
+* Improved post details clipping for better screen reader support.
+* Updated custom language packs for multiple languages.
+
+**Security Improvements**
+
+* We now avoid path disclosure via cookies in PHP error messages.
+
+**Compatibility Improvements**
+
+* Removed deprecated functions `get_theme` and `get_current_theme`.
+* Publicize now works with third-party plugins like WP Recipe Maker.
+* Open Graph Meta Tags are now enabled when you use the "Head, Footer and Post Injections" plugin.
+* Better support for WooCommerce data sync and backup.
+* We now also sync the `sync_via_cron` setting, the user's chosen language, and WP Super Cache's globals and constants.
+* We no longer sync post types from the WordPress Automatic Plugin and RSS AutoPilot to avoid synchronization issues.
+* Sync settings can now be edited from the WordPress.com REST API to better troubleshoot sync issues.
+
+**Bug Fixes**
+
+* Gravatar is always displayed in Settings.
+* Submenu items always use relative links.
+* Contact Form avoids PHP notices when using the form in a Text widget.
+* Content Options now correctly displays single characters word count on sites with multibyte languages.
+* Administrator area translations fixed for several languages.
+* Added proper support for Formal/Informal translation versions for languages that support them.
+* Site Icons are always used as fallback Open Graph Image tags.
+* Protect removes port number when server returns a port alongside a stored IP address.
+* Filters ensure that more than 1,024 posts can be excluded from Related Posts.
+* When the email is already subscribed we now show the correct notification in the subscription form.
+* When using the Email sharing button, we now avoid syntax errors due to unexpected characters in the from name.
+* Remove deprecated `jetpack_publicize_post` action.
+* VideoPress now avoids PHP Notices when fetching video information.
+* Instagram base URL now uses `www` in the Social Media Icons widget.
+* All values entered in Facebook Page Plugin widget settings are now escaped.
+* Widget Visibility now avoids memory issues on sites with a lot of registered users.
+
+= 4.7.1 =
+
+* Release date: March 14th, 2017
+* Release post: http://wp.me/p1moTy-48Y
+
+**Bug Fixes**
+
+* Carousel: avoid javascript errors that may cause issues with Slideshows or Tiled Galleries.
+* Markdown: always enable Markdown for posts whenever the module is active.
+* Sharing: make sure that sharing buttons open in a small pop-up instead of a separate window.
+* SSO: Avoid token or nonce errors when trying to log in to your site via the Secure Sign On option.
+* VideoPress: add in the ability to get video thumbnails from the WordPress.com REST API.
+* Widgets: improve rendering of the Image Widget via Photon.
+* Widget Visibility: avoid empty widget visibility rules after updating to Jetpack 4.7.
+* Widget Visibility: restore the option to make widgets appear on archive pages of different Custom Post Types.
+* Widget Visibility: migrate widget visibility settings to the new major Page rule for Custom Post Types.
+* Widget Visibility: add missing CSS for widget visibility settings on sites using an RTL language.
+
+= 4.7 =
+
+* Release date: March 7th, 2017
+* Release post: http://wp.me/p1moTy-46L
+
+**Enhancements**
+
+* Quickly jump to post specific stats on WordPress.com with a new link.
+* We've added more information to our debug tools to improve your support experience.
+* New HTML5 versions of our house ads are out.
+* Display custom copyright EXIF information in the Carousel with this new filter.
+* We've highlighted the ability to export Contact Form feedback as it was being overlooked.
+* If you have images on WordPress.com we're going to skip using Photon when the images include resize parameters.
+* It is now possible to use the Sharing filter to customize the emails sent from the Email Sharing button.
+* We've updated the library powering the Print link in the Recipe shortcode.
+* Customize the speed and display of your slideshows with new Slideshow shortcode filters.
+* The Twitch.tv shortcode now uses Twitch's new embedded player.
+* Social Menus now come with the option to use SVG icons.
+* Customize the content of the Display Posts Widget with a new filter.
+* We've added a new email field to the Contact Info Widget.
+* The Image and the Text widgets now use Photon if it is enabled.
+* The WordPress.com REST API got several updates including using `register_rest_route()` consistently for registering, new date and time format settings, a filter for theme info results, new links and endpoints, and more.
+* We cleaned up the Google+ Shortcode JS library and added a way to filter the SlideShare shortcode.
+
+**Performance Improvements**
+
+* Experience better performance with single page load caching of the media summary.
+* We made some improvements to avoid slow queries on sites with thousands of images.
+* The Top Posts widget now utilizes an endpoint from the WP.com REST API improving performance.
+* Improve development mode performance by only calling `site_url()` once.
+* We rewrote the way major/minor rules lists are generated to save bandwidth, and memory for sites using Widget Visibility.
+* We've removed sync options that weren't needed to save memory during the sync process.
+
+**Accessibility**
+
+* We've improved the highlight of the stats range for a better visual experience and to make it consistent with other areas of the dashboard.
+* Added a missing label to one of the fields in the Email sharing dialog.
+* We've enabled keyboard focus styling in the new admin interface.
+* Increased padding to sharing buttons on mobile to avoid usability issues.
+* We've replaced Widget Visibility text labels with icons to improve usability on smaller devices.
+
+**Slightly Less Exciting Enhancements:**
+
+* We've added a filter to allow you to remove the Comment Form title.
+* The Development Mode notice got an update to include all possible options to activate Development mode.
+* Jetpack registration function got an update and cleanup.
+* A notice displayed to WooCommerce store owners now detects when WooCommerce Services is installed, but not active.
+* We've removed the Holiday Snow settings until you need them.
+* Improved Infinite Scroll settings to reduce confusion.
+* The HTML classes `infinite-scroll` and `neverending` are now applied using JS instead of PHP.
+* We've updated the support link appearing when you're locked out of your site.
+* New Unit Tests were added to make sure Publicize doesn't break when making changes to the Publicize process.
+* We've added a sync filter to allow customizing timeout.
+* The Top Posts widget now supports non-square image sizes.
+* Added the Video GUID to the media API endpoint.
+
+**Improved Compatibility**
+
+* Fixed some W3C validation errors in Comments.
+* Infinite Scroll now works beautifully with the Twenty Seventeen Theme.
+* Translate new terms easier with an improvement to the translator comments.
+* We switched to use Core functions to retrieve the list of sites in a multisite network for more accurate results.
+* We added Product visibility to post meta whitelist, for better control of products displayed in Related Posts.
+* We no longer sync specific post meta data added by Postman or WP RSS Multi Importer to avoid performance issues during the sync process.
+* We're now avoiding conflicts with plugins adding the core Video upload library to the post editor.
+* Removed deprecated compatibility code for older versions of WordPress.
+* We had some Shortcode conflicts with WordPress Post embeds, but that's been fixed.
+
+**Bug Fixes**
+
+* The Carousel `jp_carousel_load_for_images_linked_to_file` filter wasn't working well with Photon, this has been fixed.
+* Carousel is now working well when loaded from infinite scroll.
+* We removed double slashes from file paths in the Contact Form to avoid errors in specific server environments.
+* Fixed a problem where CSS was being stripped when migrating from Jetpack's Custom CSS to Core's CSS editor.
+* Our Debug Tool is now reporting the correct URL when WordPress lives in a subdirectory.
+* Found and fixed a PHP error when uninstalling Jetpack.
+* Infinite Scroll is no longer buggy when displaying the last page, and is more compatible with certain themes that were returning posts when there were none left to show.
+* We're now skipping Photon for .ashx files.
+* The Twitter character counter in Publicize got a fix to display info correctly.
+* Related Posts are now displaying correctly for everyone, and we brought back the `jetpack_sharing_headline_html` filter.
+* We've improved Sharing to render custom sharing services correctly, include Open Graph Meta Tags, and avoid JavaScript errors when jQuery is enqueued in the footer.
+* Synchronization scheduling issues have been resolved.
+* We're now trimming spaces in URLs for Image and Display Posts Widgets.
+* Widget Visibility wasn't playing nice on taxonomy pages, this is no longer the case.
+* The WordPress.com REST API received a couple of fixes to remove PHP errors when editing via the WordPress.com interface, authentication errors when using third-party apps, and permission errors when trying to preview edited posts in the WordPress.com editor.
+
+= 4.6 =
+
+* Release date: February 7, 2017
+* Release post: http://wp.me/p1moTy-40g
+
+**New Features and Improvements**
+
+* Enable Google Analytics without touching a line of code with this new Jetpack feature.
+
+**Performance Improvements**
+
+* We've updated all outbound links to use HTTPS to improve performance and security.
+* Photon now leverages a new WordPress core function to improve performance a bit.
+
+**Enhancements**
+
+* Keep an eye out for a note from WooCommerce on how your e-commerce store may benefit from our new USPS and CanadaPost shipping functionality.
+* We've added an error message if Publicize isn't functioning as it should be.
+* The Twitter Widget timeline now displays the tweet limit count as 20, prior to this it appeared to have no limit.
+
+**Slightly Less Exciting Enhancements:**
+
+* In an effort to help us better understand features that are being used, Twitter's timeline widget and Twitter's shortcodes now pass Jetpack's partner ID.
+* We've added new API endpoints allowing us to enable translation auto-updates and pull post rows and metadata for backups.
+* We're now retrieving all feature settings in the readable `/settings` endpoint.
+
+**Improved Compatibility**
+
+* We've eliminated some notices and warnings when using Jetpack on a server running PHP 7.1 or on servers where `print_r()` is disabled.
+* Photon now avoids PHP notices when your site is using plugins that do srcset CDN replacement.
+* When the sharing options appear to be incorrect due to site configuration issues we force it to retrieve the right options avoiding potential fatal errors.
+* We've added some shortcode CSS and widget class names prefixes to avoid conflicts with other plugins.
+
+**Bug Fixes**
+
+* Some sites were using illegal multibyte characters and failing to sync posts, this has been fixed.
+* IE11 was giving our admin layout a bit of a problem but we rectified that.
+* There were some PHP notices popping up when a site has no posts so we got rid of them.
+* The new Jetpack Ads feature will auto disable itself if your Jetpack plan doesn't support the feature.
+* We fixed a few PHP notices and warnings related to the Custom CSS feature.
+* The connection banner's "dismiss" icon was giving us a little trouble, but we got it fixed right up.
+* The Likes feature was showing a PHP notice when there was no $post object, this has been fixed.
+* We've brought back the Twitter Widget "noscrollbar" option.
+* We're now forcing only Photon URLs to HTTPS as your custom CDN URLs may use a different protocol.
+* If a Publicize connection is not shared with all users on the site, do not trigger Publicize for the other users.
+* Publicize was having trouble working with scheduled posts, this should be fixed now.
+* SSO may not have been displaying the login form when using JSON API authorization. Sorry about that, we've fixed it.
+* We've eliminated some PHP notices that were showing with some Shortcodes.
+* There was a Top Posts Widget image size issue when using list layouts, but is no longer causing issues.
+* We fixed some notices and warnings when updating data from the WordPress.com central interface.
+
+= 4.5 =
+
+* Release date: January 17, 2017
+* Release post: http://wp.me/p1moTy-3Kc
+
+This release introduces a brand-new module, Jetpack Ads, a brand-new VideoPress feature, and a lot of new shortcodes and widgets.
+
+**Exciting New Features and Improvements:**
+
+* Generate revenue from your site with an all-new WordAds feature, which when enabled displays high-quality ads for your visitors.
+* Today we are proud to release a fully redesigned VideoPress interface for easy uploading, management, and add-free playback of your fantastic videos now fully integrated with your Jetpack Premium or Professional plans.
+* Spice up your sidebar with new widgets that display blog stats, author info, "Follow my blog" buttons, and even an event countdown.
+* Embed your amazing 360° photos with the VR shortcode
+* Link your visitors to your Tumblr or Twitch pages using the new icons in the Social Media Icons Widget.
+
+**Enhancements**
+
+* Use the beautiful Jetpack carousel feature to display single images.
+* Turn on and update Related Posts right from the Customizer.
+* Customize the output of the Related Posts headline using a new filter.
+
+**Performance and Security Improvements:**
+
+* Your Custom CSS will now be served in a separate stylesheet when it is more than 2,000 characters.
+* Your Stats queries are now always being made over HTTPS.
+* Holiday Snow files now load in the footer, but rest assured the snow still falls from above.
+* We have improved Jetpack's synchronization process to support more plugins and use less resources.
+* The jQuery Cycle script used by slideshow galleries is now minified, resulting in faster loading times.
+
+**Slightly Less Exciting Enhancements:**
+
+* The JSON API now allows updating translations and alternative theme installation methods.
+* Public Custom Post Types are now automatically available via the WordPress.com REST API.
+* We've added a token-based authentication mechanism to the REST API in order for the site to be able to receive authenticated requests from WordPress.com.
+* Use `sync` commands in Jetpack's WP CLI.
+* You can now set the value for options directly in the Contact Form shortcode.
+* Updated some verbiage around IP Whitelisting on the Protect settings screen.
+* Custom sharing buttons got some new variables.
+* RIP blip.tv — we've removed your shortcode.
+* Improved Image and Display Posts Widget settings to provide more explanation and better error messages.
+* We've added a few new Content Options to the Customizer for supported themes.
+* Improved the Facebook Widget to avoid confusion when editing width and height settings.
+* Added and improved a few shortcodes.
+
+**Improved Compatibility:**
+
+* If your server is misconfigured and we can't get an IP address we're going to deactivate Protect and send you a notice so you're in the loop.
+* The WPML compatibility file wasn't loading at the right time, but we've fixed that.
+* We've improved compatibility with tools like Cavalcade to avoid stuck Cron jobs.
+* Some selected WooCommerce data (order items and order item meta) are now syncing to WordPress.com.
+
+**Bug Fixes**
+
+* You'll notice numerous design improvements to the Jetpack UI.
+* Accessibility is important to us so we've made some improvements there.
+* Missing attachments in the Carousel were causing an infinite loop, but we've corrected that.
+* Eliminated a PHP Notice when running the CLI `wp jetpack` command.
+* PHP warnings in the Restaurant Menu Post type have seen their last day with us.
+* Fixed a bug that displayed the wrong connected user for up to 24 hours after they disconnected.
+* Removed a deprecated function to prevent notices when using Infinite Scroll in the Customizer.
+* Long titles in Jetpack widgets weren't looking so great, so we cleaned them up.
+* Before now you weren't able to create a child category from WordPress.com. Now you can!
+* Rogue colons were showing up in the related posts area on sites with the Twenty Fourteen and Twenty Sixteen themes.
+* Fixed a ReCaptcha error on the Email sharing button.
+* Confirmed Instagram embeds actually load when using Infinite Scroll.
+* Site Icons now display on the WordPress.com site management interface.
+* Set a default time limit of 30 seconds when sending sync requests via Cron.
+* Synchronized supported shortcodes on a site.
+* Fixed an issue where empty categories weren't showing with the Widget Visibility feature dropdown.
+* Fixed various little bugs when working with multiple widgets in the Customizer and in the Widgets admin screen.
+* Added a Translate Widget default title in case you haven't defined one.
+* The Top Posts Widget now avoids layout issues when using the Grid layout while displaying a post without an image.
+
+= 4.4.2 =
+
+* Release date: December 6, 2016
+* Release post: http://wp.me/p1moTy-3JR
+
+This release improves Jetpack compatibility with WordPress 4.7.
+
+**Compatibility changes**
+
+* Custom CSS: Made the Custom CSS feature of Jetpack compatible with the CSS Customizer editor in WordPress 4.7.
+* Sync: improved compatibility with the wp-missed-schedule plugin.
+
+**Bug fixes**
+
+* Featured Content: made sure there is no infinite loop when removing the featured tag from the tag list.
+* Admin: made sure help tabs are not being hidden.
+* Admin: made At a Glance page work nicely when there is no backup data yet.
+* Sync: now making sure that needed classes are loaded, preventing errors.
+* Sync: cleared out unneeded scheduled jobs.
+
+= 4.4.1 =
+
+* Release date: November 22, 2016
+* Release post: http://wp.me/p1moTy-3JR
+
+**Bug Fixes**
+
+* Fixed an issue where some users with slower servers would get an error on
+the Jetpack dashboard when `WP_DEBUG` was enabled.
+* Fixed an issue where users on a Jetpack Professional plan who were paying
+monthly (as opposed to annually) wouldn’t be able to enable SEO Tools.
+
+= 4.4 =
+
+* Release date: November 21, 2016
+* Release post: http://wp.me/p5U9nj-2Ow
+
+**Enhancements**
+
+* Additional unit tests have been added to improve Jetpack's development process and stability.
+* Custom post types have been added to the WP REST API output.
+* Many of the screenshots throughout the plugin have been replaced by SVGs in order to make Jetpack smaller.
+* New endpoints have been added to allow the installation of plugin and theme zip files via the API.
+* Twelve new filters to make Jetpack more extensible! See: http://wp.me/p5U9nj-2Ow.
+* New widget: "Google Translate" to allow users to translate your site into their own language.
+* New widget: "My Community" where you can see who recently interacted with your site.
+* One of the biggest issues facing Jetpack users for years now has been difficulties in moving sites from one domain name to another. This update makes strides towards improving that process.
+* Photon now uses HTTPS by default. Secure all the things!
+* There are now helpful hints throughout the admin interface to make Jetpack easier to use.
+* We now allow you to embed pins, boards and profiles from Pinterest.
+* We've added a new feature: SEO Tools, available to Jetpack Professional subscribers. You can read more about our plans here: https://jetpack.com/features/
+* We've made numerous improvements to the data sync process.
+
+**Bug Fixes:**
+
+* Fixed link to Akismet settings.
+* Improved compatibility between Infinite Scroll and WPML.
+* Move email notification settings back with the other email settings in the Discussion Settings.
+* Various minor performance/compatibility fixes.
+
+= 4.3.2 =
+
+* Release date: October 13, 2016
+
+**Enhancements**
+
+* Unsaved changes were getting lost when users were navigating away from settings so we put in a confirmation message to prevent this from happening.
+* We've stopped counting carousel views in stats by default, you can use the `jetpack_enable_carousel_stats` filter to enable counting them again.
+* Stats are now responding faster.
+* There were several improvements and repairs made to sync including additional endpoints, performance enhancements, whitelisted data, better decision making around when to sync information, and more.
+* Markdown now has a CSS class on footnotes.
+
+**Improved Compatibility:**
+
+* We've improved compatibility with Kinsta by automatically turning on Staging Mode for Jetpack when in a staging environment.
+
+**Bug Fixes:**
+
+* Several fixes have been made to sync to repair issues with Publicize, Notifications, and Subscriptions.
+* We removed PHP warnings by checking to make sure json language files like jetpack-en_US.json are readable before we load them.
+* We found an unused option in Gravatar Hovercard settings and removed it.
+* The correct support link is now being used to make it easier for you to connect with the Jetpack team if you need us.
+* The permissions check for plugin information retrieval was fixed as well.
+* Some plugins were adding content on outbound http requests causing an infinite loop we fixed this right up.
+* We removed some warnings that were occurring when translations didn't exist by adding a fallback.
+* We've added Moroccan Arabic translations, and switched to language packs for Croatian, Spanish (Chile) and Greek.
+* Sync was running into issues so we've limited dequeue time to 1/3 of PHP's max execution time, which has unclogged the problem.
+* We're now sending full and incremental queues separately so that a failure in one doesn't block the other.
+* There was a JavaScript enqueuing error with our Sharing feature that has been repaired.
+* The Top Posts widget now includes the ability to list attachment (media) pages.
+* We weren't building CPT links correctly resulting in bad navigation, which is now fixed.
+* We removed the form legend for default Tiled Gallery settings as it doesn't relate.
+* With shortcodes we now return early from processing them if no string is passed, as they are required.
+
+= 4.3.1 =
+
+* Release date: September 8, 2016
+
+**Support Enhancements**
+
+* We're now syncing data about hosts so that we can provide better support
+when needed.
+* Minor update to inline docs to match version numbers.
+
+**Bug Fixes:**
+
+* Admin Page: fix error when Admin Page resources could not be fetched with
+`wp_remote_get` due to unique host configurations.
+* Admin Page: fix error when Post By Email could not be enabled when the
+browser's dev console was enabled.
+* Admin Page: make sure all translated strings are encoded properly.
+* Admin Page: only use POST requests for updating the state of Jetpack, to
+avoid issues on servers not allowing PUT requests.
+* Admin Page: search icon no longer overlaps the global notices.
+* Admin Page: make sure that non-admins can also modify Spellchecking
+settings.
+* Admin Page: check that a json language file like jetpack-en_US.json is
+readable before loading its contents and thus avoid a PHP warning.
+* General: Improve random number generation for compatibility with more hosts.
+* General: Add deprecated PHP file (class.jetpack-landing-page.php) back as an
+empty file, to avoid generating fatal errors on sites with aggressive caching.
+* General: Ensure concatenated CSS is generated for RTL languages.
+* Security: Ensure that all options are included on the security tab.
+* Stats: fix display for sites with pretty permalinks disabled.
+* Subscriptions: ensure that no email is sent when updating a published post.
+* Sync: To improve performance, add snapTW to the list of post meta data that
+won't be synchronized for each post.
+* Sync: do not schedule a full sync after each import.
+* Verification Tools: in the Settings card, use appropriate link for each
+service.
+
+
+= 4.3 =
+
+* Release date: September 6th, 2016
+
+**Exciting Performance and UI Improvements:**
+
+* We have launched the all new React powered interface, a year in the making,
+designed to give you better control of your favorite Jetpack features.
+
+= 4.2.2 =
+
+* Release date: August 19th, 2016
+
+**Bug Fixes:**
+
+* We fixed the code which displays the Facebook share count to accomodate
+Facebook's new data structure.
+* We fixed an issue which caused PHP notices to get logged for users of the
+Twenty Fourteen theme.
+* We fixed an issue with the Minileven mobile theme which was preventing it
+from loading.
+* Improved Sync performance.
+* Increase security by sanitizing a URL used in the SSO process.
+
+= 4.2.1 =
+
+* Release date: August 17th, 2016
+
+**Bug Fixes:**
+
+* We fixed a conflict between Jetpack and W3 Total Cache.
+* We fixed some issues with Publicize and Custom Post Types.
+* Very large Multisite networks with lots of users can now be synchronized
+with WordPress.com.
+* We improved the synchronization process between your site and WordPress.com.
+
+= 4.2 =
+
+* Release date: August 10th, 2016
+
+**Performance Enhancements:**
+
+* We’ve improved Jetpack’s performance by making calls to the database more
+efficient; essentially, Jetpack is doing less on each page load, making things
+faster. #4281, #4316
+* We’ve ensured that every feature uses information that is up to date by
+completely refactoring the way information was synchronized between your site
+and WordPress.com.
+* We've improved the way Jetpack queries for information about features, which
+results in less overall queries.
+
+**Exciting Feature and UI Improvements:**
+
+* We now track your visitor views of Carousel images in stats.
+* You can now customize advanced typographic settings like ligatures in the
+Custom CSS editor with new support for the `font-feature-settings` property.
+* We’ve improved the experience when you don’t actually have enough posts to
+Infinitely Scroll.
+* Our Contact Info Widget allows you to enter a Google Maps API Key which is
+now required by Google if you want to display a map.
+
+**Security:**
+
+* We’re continuing our efforts to harden Jetpack security, by implementing the
+`hash_equals()` function to avoid timing attacks when comparing strings. We
+also improved security on CSVs exported from your contact form.
+
+**Slightly Less Exciting Feature Improvements:**
+
+* The Cartodb shortcode has been changed to match the new product name, Carto.
+* The YouTube shortcode now uses the content width defined by the theme when
+available, even if an embed size was defined in an old version of WordPress.
+* Breadcrumbs now support hierarchical post types and taxonomies.
+* We’ve added the Portfolio Post Type to the WordPress.com REST API whitelist.
+* There are a few new parameters for the Dailymotion shortcode.
+
+**Improved Compatibility:**
+
+* We now work well with WP Stagecoach staging sites, so you should not see any
+future impact on production sites.
+* We had some PHP notices popping up in the WooCommerce plugin wizard screen,
+these are gone.
+
+**Bug Fixes:**
+
+* We stopped loading compatibility stylesheets on the default theme's singular
+views for Infinite Scroll.
+* Debug tests forwarded through the contact form in the Jetpack Debug menu are
+now successfully sent to the support team.
+* We’ve removed the PHP notices you might have seen when moderating comments.
+* There are no longer PHP notices cropping up when publishing via Cron.
+* We’ve fixed the official Sharing buttons so they now line up just right.
+* The PHP warnings of Sitemaps stylesheets have been eliminated.
+* We’ve done away with the warnings that appeared when Tonesque processes a
+file which claims to be one filetype, but is actually another.
+* We’ve exterminated PHP notices that appeared when using Random Redirect, as
+well as when the author wasn't set.
+
+= 4.1.1 =
+
+* Release date: July 7th, 2016
+
+**Bug Fixes:**
+
+* SSO: Use high-resolution Gravatar images on the log-in form on Retina
+devices.
+* Publicize: improve reliability of Publicize when publishing new posts.
+
+= 4.1 =
+
+* Release date: July 6th, 2016
+* Release Post: http://wp.me/p1moTy-3jd
+
+**Performance Enhancements:**
+
+* Carousel no longer loads full-size images in the previous and next previews,
+increasing the speed and performance of slideshows.
+* We’ve improved Jetpack’s performance by making calls to the database more
+efficient; essentially, Jetpack is doing less on each page load, making things
+faster.
+* We’ve improved Photon dev mode, eliminating unnecessary attempts to sync
+images.
+
+**Exciting Feature and UI Improvements:**
+
+* A new look: SSO, redesigned and refactored, provides a new and improved
+experience.
+* Tracking made simple: quickly view the number of unread feedback submissions
+in your sidebar.
+* Getting support just got easier! Access improved self-help tools in the
+Jetpack Debug menu.
+* Greater control over Infinite Scroll: pause and resume Infinite Scroll with
+two new JavaScript methods.
+* Improved Sharing: we’ve swapped image icons for icon fonts and added
+Telegram and WhatsApp buttons.
+* Untappd shortcode: now you can sip and share your favorite craft brews.
+Cheers!
+* Recipes, revamped: we’ve added new recipe shortcodes and options to create
+more detailed recipes.
+* Improved Gallery Widgets now use Photon to resize and serve images.
+
+**Security:**
+
+* We’re continuing our efforts to harden Jetpack security by implementing the
+`hash_equals()` function in an effort to avoid timing attacks when comparing
+strings.
+* We’ve made it easier to use SSL connections on ports `80` and `443`,
+improving our ability to communicate with an increased number of secure
+websites.
+* You will now receive a warning for any failed attempts when connecting your
+website via SSL.
+
+**Slightly Less Exciting Feature Improvements:**
+
+* Updated the Infinite Scroll settings verbiage, which was a bit confusing.
+* Removed Jetpack Audio Shortcode, which is no longer in use.
+* Redesigned Jetpack banner notices to match core notification styles.
+* Added an icon on a connected Jetpack user’s profile page, next to their
+name.
+* Added the ability to edit Portfolio custom-post-type options in the
+Customizer.
+* Added a new filter called `jetpack_publicize_capability` which allows you to
+override user role restrictions for Publicize.
+* Improved the connection process between Jetpack and WordPress.com making it
+easier to start using Manage.
+* Updated the Top Posts Widget so you can use and display posts that are older
+than 10 days.
+* Updated the Twitter Timeline Widget to support updates made by Twitter.
+* Improved the VideoPress Shortcode modal.
+* Updated VideoPress, which now defaults to HTML5 videos when the `freedom`
+shortcode parameter is in use.
+* Improved how Jetpack syncs by removing mock options.
+* Updated the naming convention for feedback posts.
+* Updated several JSON API endpoints to match WordPress.com endpoints, added
+support for custom taxonomies, and enabled trash as a valid status for the
+post update endpoint.
+
+**Improved Compatibility:**
+
+* A community member found and fixed a compatibility issue with our Open Graph
+Meta Tags and Bitly’s older plugin -- we now check to make sure we don’t
+create conflicts.
+* We’ve fixed a rare scenario where an error would occur when other plugins or
+sites were using the `JETPACK__GLOTPRESS_LOCALES_PATH` constant.
+
+**Bug Fixes:**
+
+* Comment avatars are now retrieved in a manner more consistent with the login
+avatar, improving consistency and eliminating the possibility of a future bug.
+* We eliminated PHP notices that were appearing when Custom Content Types were
+defined without labels or sections.
+* PHP memory limits were reached in rare cases when a website had thousands of
+revisions of their Custom CSS. The issue is fixed -- happy editing!
+* jQuery deprecated the `size()` function -- as a result, we’ve stopped using
+it as well.
+* A PHP notice popped up when plugins were updated from the WordPress.com
+plugin management interface -- these notices will no longer appear.
+* We fixed a bug where Photon wasn’t providing the original size for images
+that were being used outside of the post content.
+* We eliminated the PHP notices that displayed when posts with slideshows were
+added to a sitemap.
+* We fixed an error that was showing up in Sitemaps when a website permalink
+structure used `index.php`.
+* We eliminated JavaScript errors that displayed when tiled galleries were
+viewed.
+* We fixed an issue where image dimensions weren’t properly saved when added
+to a new widget.
+* Since Google Maps API keys are now required to use maps, we’ve updated the
+Contact Info Widget to allow site owners to set up their keys.
+* We fixed a bug where multiple `display` properties weren’t able to be saved
+in Custom CSS.
+
+= 4.0.4 =
+Release date: June 20th, 2016
+Release Post: http://wp.me/p1moTy-3eT
+
+Security:
+
+* Post By Email: Added an additional layer of security to prevent unauthorized
+changes to Post By Email settings.
+* Likes: Fixed an XSS vulnerability in the Likes module.
+* REST API/Contact Form: We've eliminated unauthenticated access to Feedback
+posts.
+
+Feature Improvements:
+
+* Customizing Protect: We've increased Protect’s response time and added a new
+filter, `jetpack_protect_connect_timeout`, reducing the likelihood of seeing
+the fall back form.
+* Connection Process: Your site url and icon are displayed on the Jetpack
+connection screens to help improve communication.
+* Jetpack for Multisite: It’s now easier to manage your Jetpack connections on
+the network admin screen.
+* Photon Responsive Image Improvements: We’re now auto-generating new scrset
+options, improving how images served from Photon are handled.
+* Developing on Kinsta: A new constant has been added to improve developing
+with Jetpack on a staging environment hosted with Kinsta.
+
+Jetpack UI Improvements:
+
+* Better Access to Our Support Team: We wanted to make it easier for you to
+get help so we added a contact form in the admin that links directly to our
+Jetpack Support Team.
+
+Improved Compatibility:
+
+* We’ve stopped adding Open Graph Meta tags if you’re using the SEO Framework
+plugin.
+* Having both GlotPress and Jetpack active at the same time was causing
+errors, we’ve eliminated them.
+
+Bug Fixes:
+
+* Fixed the handling of special characters like ampersands in Carousel Titles
+and Descriptions.
+* When visitors tried to view a Carousel image with a hash in the URL, a
+JavaScript error would occur; we’ve fixed that.
+* Jetpack Comment form fields now use the default language you’ve set for
+WordPress, previously the verbiage was always in English.
+* Custom CSS wasn’t handling slashes and quotes properly; we’ve squashed that
+bug.
+* There were some rare cases where PHP notices were popping up when a Contact
+Form was submitted. These instances have been identified and eliminated.
+* We’ve replaced a bit of code with a Jetpack native function to fix a bug
+that was breaking things during an API request for available updates.
+* We accidentally removed the ability for Open Graph to select images from
+slideshows, it’s up and running again.
+* There was an issue where Open Graph meta tags weren’t being set when your
+homepage is a “Static Front Page”, it’s working again.
+* In rare cases when developers were customizing Photon they were seeing a PHP
+notice when arguments were passed as a string rather than an array. This has
+been fixed.
+* We’ve fixed an issue where Protect’s backup math form wasn’t showing on
+custom front end login forms.
+* When setting up WooCommerce you might have seen a Related Posts notice which
+didn’t belong. We’ve eliminated them.
+* If you’ve been using our sharing tool with unofficial sharing buttons you
+might have noticed your sharing numbers were missing. They’re now back.
+* In unique situations where special characters were used in sitemap
+stylesheets an error would occur; that has been remedied.
+* We’ve fixed a problem with mismatching HTML tags in our Spelling and Grammar
+feature.
+* We’ve ensured that the `jetpack_disable_twitter_cards` filter actually
+removes Twitter cards.
+* We’ve fixed some JavaScript errors that would crop up if you were editing a
+custom-post-type post that didn’t support the core media editor — say that 10
+times fast.
+* We had some JavaScript errors when you were using the customizer to modify
+widgets. They are no longer with us.
+
+= 4.0.3 =
+Release date: May 26th, 2016
+Release Post: http://wp.me/p1moTy-3hm
+
+* Important security update. Please upgrade immediately.
+
+= 4.0.2 =
+Release date: April 21st, 2016
+
+Bug Fix:
+
+* Addresses an issue where Jetpack 4.0 caused a fatal error on sites with
+specific configurations.
+
+= 4.0 =
+Release date: April 20th, 2016
+Release Post: http://wp.me/p1moTy-3dL
+
+Performance Enhancements:
+
+* Protect: the routine that verifies your site is protected from brute-force
+attacks got some love and is more efficient.
+* Contact Forms: cleaning the database of spam form submission records is more
+efficient.
+
+Feature Improvements:
+
+* VideoPress: edit your VideoPress shortcode in the editor with a fancy new
+modal options window.
+* Custom Content Types are now classier: a new CSS class on Testimonial
+featured images — has-testimonial-thumbnail — allows you to customize Jetpack
+custom post types as you see fit.
+* Sharing: social icons are now placed under the "add to cart” singular
+product views in WooCommerce, making it easier for customers to share your
+products on social media.
+* Theme Tools: search engines will now have an easier time knowing what page
+they are on, and how that page relates to the other pages in your site
+hierarchy with improved schema.org microdata for breadcrumbs.
+* Widget Visibility: now you can select widgets and when to show or hide them
+right from custom post type single and archive views.
+
+Jetpack UI Improvements:
+
+* What’s in it for me? We’ve done a better job explaining the benefits of
+Jetpack and connecting it to WordPress.com.
+* Shortcodes: handy links to shortcode documentation convey the types of media
+you can quickly and safely embed.
+* Widgets: As of WordPress 4.5, Jetpack widgets now refresh in the customizer
+without making you refresh the entire page. Live previews, yes indeed.
+
+Bug Fixes:
+
+* Comments: we fixed a mistake where a comment subscription checkbox appeared
+on custom post types — despite the fact you couldn’t actually subscribe to
+those types of comments. Our bad.
+* Contact Forms: we fixed a bug where the telephone field (which can only be
+added manually) rendered incorrectly — breaking some forms in the process.
+* General: we blocked direct access to the Jetpack_IXR_Client class which
+caused fatal PHP errors in some server setups.
+* Shortcodes: we removed the frameborder attribute in the YouTube embed code.
+It was deprecated in HTML 5.
+* Unminified responsive-videos.min.js in order to address a false positive
+virus alert in ClamAV. Expect it to be re-minified in 4.0.3 once we resolve
+the issue with ClamAV.
+
+= 3.9.6 =
+Release date: March 31st, 2016
+Release Post: http://wp.me/p1moTy-3bz
+
+Bug fix: Shortcodes: fixed incorrect Vimeo embed logic.
+
+= 3.9.5 =
+Release date: March 31st, 2016
+Release Post: http://wp.me/p1moTy-3bz
+
+This release features several WordPress 4.5 compatibility changes that make
+several Jetpack features work properly in the Customizer view. Big thanks to
+@westonruter for contributing the code!
+
+Other enhancements and bug fixes:
+
+* Contact Form: no longer calling the datepicker method if it's not available.
+* SSO: settings checkboxes now honor filters and constants that restrict
+certain sign-in modes.
+* Shortcodes: fixed a problem with Gist fetching.
+* Shortcodes: fixed invalid HTML5 markup in YouTube embed code.
+* Shortcodes: made the Vimeo links work properly in case of multiple mixed
+uses in one post.
+
+= 3.9.4 =
+Release date: March 10th, 2016
+Release post: http://wp.me/p1moTy-396
+
+Bug fix: Shortcodes: Addresses an issue with embedded Vimeo content
+
+= 3.9.3 =
+Release date: March 9th, 2016
+Release post: http://wp.me/p1moTy-396
+
+Featured:
+
+* Site Logo now supports Custom Logo - a theme tool to be introduced in
+WordPress 4.5.
+
+Enhancements:
+
+* Carousel: Made the full size image URL use a Photon URL if enabled.
+* Comments: Removed an unnecessary redirect by always connecting via HTTPS.
+* General: Added new actions that fire before automatic updates.
+* Infinite Scroll: Introduced a later filter for settings.
+* Infinite Scroll: Removed code that is now redundant due to WordPress Core.
+* Markdown: Removed deprecated markup from the output.
+* Publicize: Improved handling of featured images in posts.
+* Shortcodes: Added houzz.com support.
+* Sitemaps: Added a language attribute to the news sitemap.
+* Sitemaps: Improved the image retrieval mechanism for posts.
+* Widgets: Added new filters in the Top Posts Widget code.
+* Widgets: Cleaned up the CSS for the Subscription widget.
+
+Bug Fixes:
+
+* Comments: No longer reloading the page on clicking the reply button.
+* Contact Forms: Fixed a fatal error on missing metadata.
+* Contact Forms: Fixed message formatting for plaintext email clients.
+* Shortcodes: Fixed dimensions of Vimeo embeds in certain cases.
+* Shortcodes: Fixed warnings and allowed shorter style Vimeo embeds.
+* Shortcodes: Removed alignment markup from feeds for YouTube embeds.
+* Sitemaps: Made URLs display properly according to the permalink structure.
+* Stats: Fixed non-XHTML-valid markup.
+* Widgets: No longer showing errors when adding new instances of the Display
+Post Widget.
+
+= 3.9.2 =
+Release date: February 25th, 2016
+Release post: http://wp.me/p1moTy-2Ei
+
+Maintenance and Security Release
+
+Featured:
+
+* Beautiful Math: fix XSS vulnerability when parsing LaTeX markup within HTML
+elements.
+* Contact Form: do not save private site credentials in post meta. Thanks to
+@visualdatasolutions.
+
+Enhancements:
+
+* Contact Info: Added two hooks for adding arbitrary information to the
+widget.
+* Development: Added new possibilities for REST API debugging.
+* Embeds: Added Codepen embeds support.
+* Embeds: Added Sketchfab embeds support.
+* I18n: Added support for translation packages for the Finnish language.
+* Markdown: Added a filter to enable skipping processing of developer supplied
+patterns.
+* Related Posts: Added a filter to change heading markup.
+* Staging: Added a constant to force staging mode.
+* Staging: Added a notice to make staging mode more obvious.
+* Top Posts Widget: Added a new `[jetpack_top_posts_widget]` shortcode.
+
+Bug Fixes:
+
+* Custom Post Types: Nova: Fixed a JavaScript bug on adding multiple items.
+* Embeds: Allowing embeds from Instagram with a www in an URL.
+* General: Fixed untranslated module names on the Settings screen.
+* General: Improved module descriptions and fixed misleading or broken links
+in descriptions.
+* General: No more notices on module deprecation on older installations.
+* General: Only showing one prompt to enable Photon when uploading several new
+images.
+* Multisite: Fixed a problem with site lists for older WordPress
+installations.
+* OpenGraph: Fixed a bug to properly fallback to a WordPress Site Icon image.
+* Photon: Improve performance for images over a secure connection.
+* Photon: No longer including links from data attributes.
+* Publicize: Fixed problems for en_AU and en_CA locales with Facebook.
+* Related Posts: Fixed a notice on certain requests.
+* Site Logo: It's no longer possible to choose a non-image.
+* Widget Visibility: No longer confusing page IDs and titles in certain cases.
+
+= 3.9.1 =
+Release date: January 21st, 2016
+
+Bug Fixes:
+
+* General: Addresses a namespacing issue which was causing conflicts on some
+hosting providers.
+* Sitemaps: Added MSM-Sitemap to the list of plugins which, if installed, will
+prevent Jetpack Sitemaps from being used
+
+= 3.9 =
+Release date: January 20th, 2016
+Release Post: http://wp.me/p1moTy-29R
+
+Featured:
+
+* New sharing button: let users share your content using Skype.
+* New "Social Menu" theme tool that uses Genericons to display Social Links.
+* Sitemap support for better search engine indexing.
+
+Enhancements:
+
+* Contact Form: Added a new filter that allows you to change the "Required"
+text.
+* General: Hidden archived sites in multisite site list.
+* General: Removed several function calls that would be deprecated in
+WordPress 4.5.
+* Infinite Scroll: Added a new filter to check if Infinite Scroll has been
+triggered.
+* Likes: Added a conditional to ensure WordPress 4.5 compatibility.
+* Photon: Improved compatibility with responsive images feature added in
+WordPress 4.4.
+* Photon: Now enabled by default on sites using HTTPS.
+* REST API: Extended the ability to manage users from WordPress.com.
+* REST API: Increased the performance of the plugin update endpoint.
+* Responsive Videos: Centering videos when they are wrapped in a centered
+paragraph.
+* Sharing: Added a new filter to customize the default OpenGraph description.
+* Shortcodes: Added Wistia oEmbed support.
+* Shortcodes: Bandcamp: Added support for new attributes for tracks approved
+by artists.
+* Shortcodes: Improved Medium path format recognition.
+* Slideshow: Improved compatibility with older IE versions.
+* Staging: Improved staging environment detection.
+* Widgets: Added "width" option to the Facebook Page widget.
+* Widgets: Added size parameters to tags in Top Posts to avoid warnings.
+* Widgets: Introduced major performance and stability improvements to the
+Display Posts Widget.
+* Widgets: Refactored to remove deprecated code patterns.
+
+Bug Fixes:
+
+* AtD: Fixed replacing emojis with images in the text editor in Chrome.
+* AtD: Made pre tags be excluded from spell-checking.
+* CPT: Not registering Nova if it is already registered.
+* Carousel: Fixed a bug where full size images were not always served by
+Photon.
+* Carousel: Reverted a change that broke direct link to carousel image.
+* Contact Form: Fixed a CSV export bug with multiple choice questions.
+* Contact Form: Fixed notices when creating feedback entries without a contact
+form.
+* General: Fixed a scrolling bug on modal window closing.
+* Infinite Scroll: Disabled in the Customizer when previewing a non-active
+theme.
+* Publicize: Fixed notices appearing with bbPress or BuddyPress installed.
+* Publicize: Showing options only to users that can change them.
+* Related Posts: Fixed incorrect URLs generated for posts.
+* Responsive Videos: Fixed warnings in debug mode.
+* Shortcodes: Bandcamp: Fixed a problem with large track IDs.
+* Shortcodes: Fixed a problem with dynamic Gist embeds.
+* Stats: Fixed dashboard widget resize problem.
+* Widgets: Added a fallback to English US when a locale isn't supported by
+Facebook.
+* Widgets: Fixed layout for Twenty Sixteen.
+
+= 3.8.2 =
+Release date: December 17th, 2015
+Release post: http://wp.me/p1moTy-26v
+
+Jetpack 3.8.2 is here to squash a few annoying bugs.
+
+Bug Fixes:
+
+* Photon: Fixed a bug where some custom thumbnail image sizes weren't being
+sized properly.
+* Shortcodes: Fixed an incompatibility with how WordPress renders the YouTube
+shortcode.
+* Shortcodes: Tightened up security in the Wufoo shortcode.
+* Image Widget: Now shows the caption.
+* Fixed typos in inline docs.
+* Very minor fixes to: Carousel, Publicize, Google+, and Infinite Scroll.
+
+= 3.8.1 =
+Release date: December 1st, 2015
+Release post: http://wp.me/p1moTy-23V
+
+Jetpack 3.8.1 is here and is fully compatible with WordPress 4.4.
+
+Featured:
+
+* Photon + Responsive Images FTW.
+* Fully compatible with Twenty Sixteen.
+* More accessibility enhancements.
+* Dropped some weight by optimizing Jetpack's plugin images.
+
+Enhancements:
+
+* Comments: filter to allow disabling comments per post type.
+
+Bug Fixes:
+
+* Carousel: Stop page from scrolling to top when Carousel is closed.
+* Carousel: Browser compatibility fixes with older version of IE.
+* Markdown: Fixed a bug that would strip markdown when saving in "Quick Edit"
+mode.
+* Single Sign On: Fixed login always redirecting to the admin dashboard.
+* Subscriptions: Filter to allow per-post emails fixed for use in themes.
+
+= 3.8.0 =
+Release date: November 4th, 2015
+Release post: http://wp.me/p1moTy-1VN
+
+We're happy to introduce Jetpack 3.8, which has significant contributions from
+the Jetpack community. Read more about it here: http://wp.me/p1moTy-1VN
+
+Feature enhancements:
+
+* New Google+ Badge Widget. Display your profile, page, or community Google+
+badge.
+* New twitch.tv shortcode embeds. Display a Twitch.tv stream in your posts.
+* Accessibility enhancements.
+* A handful of new filters to allow further customization of Jetpack.
+
+Other enhancements:
+
+* Carousel: Added support to retrieve image dimensions from an image url.
+* Carousel: Simpler algorithm to detect shutter speeds.
+* Contact Form: New "Checkbox with Multiple Items" field available in the
+Contact Form.
+* Contact Form: Allow pre-filling form fields with URL parameters.
+* Contact Form: Better styling of the emailed form responses.
+* Performance: Replaced some custom-built functions with core's native
+functions.
+* Related Posts: New filter to add post classes to post's container class.
+* Sharing: New filter to choose if sharing meta box should be shown.
+* Sharing: New filter to allow sharing button markup to be editable.
+* Sharing: New filter to allow you to specify a custom Facebook app ID.
+* Social Media Icons Widget: Added option for YouTube username as well as
+Channel ID.
+* Social Media Icons Widget: Added Google+ icon.
+* Social Media Icons Widget: New filter to allow you to add your own social
+media icons and links.
+* Subscriptions: Better errors to your visitors if their subscription sign-up
+fails.
+* Subscriptions: Removed "widget" class from Subs shortcode form.
+
+
+Bug fixes:
+
+* Carousel: Fixed browser back/forward button behavior.
+* Contact Form: Allow the email field to be set to empty when building form in
+post editor.
+* Facebook Likebox Widget: Fixed an issue where some languages were not
+translating.
+* Facebook Likebox Widget: Return a language when none found.
+* General: Fixed some minor styling issues in the Jetpack admin areas.
+* General: Add missing parameter to the_title filter call.
+* General: Prevent scrolling of body when the Jetpack admin modals are opened.
+* General: Update doc to reflect that Open Graph filter
+jetpack_enable_opengraph has been deprecated in favor of
+jetpack_enable_open_graph.
+* Infinite Scroll: Fixed an error that sometimes occurred that would stop
+posts from loading.
+* JSON API: Fixed some undefined notices when publishing a post with the API.
+* Open Graph: Fixed bug where facebook description content was sometimes being
+polluted by a filter.
+* Sharing: Use full SSL Pinterest url instead of protocol relative.
+* Sharing: Fixed plus signs appearing in tweets shared from iOS.
+* Shortcodes: Prefer HTTPS for video embeds to avoid mixed content warnings.
+* Subscriptions Widget: Fix HTML Validation error.
+* Theme Tools: Check oEmbeds for the presence of a video before adding the
+responsive videos filter.
+* Tiled Galleries: Add image alt attribute if there is a title set. This was
+breaking some screen reader functionality.
+
+= 3.7.2 =
+Release date: September 29th, 2015
+Release Post: http://wp.me/p1moTy-1LB
+
+* Bug Fix: REST API: Fixed an error when saving drafts and publishing posts
+
+= 3.7.1 =
+Release date: September 28th, 2015
+Release Post: http://wp.me/p1moTy-1LB
+
+* Enhancement: General: Added inline documentation for various filters and
+functions
+* Enhancement: General: Added custom capabilities for module management on
+multi-site installs
+* Enhancement: General: Cleaned up old changelog entries from readme
+* Enhancement: General: Cleaned up unused i18n textdomains
+* Enhancement: General: Updated the new settings page to look better in
+various translations
+* Enhancement: REST API: Added new endpoints to manage users
+* Enhancement: Sharing: Updated the Google logo
+* Bug Fix: Carousel: Page scroll no longer disappears after closing the
+carousel
+* Bug Fix: Contact Form: Fields are sent and displayed in the correct order
+* Bug Fix: Contact Form: No longer showing a notice on AJAX actions in
+feedback lists
+* Bug Fix: Contact Form: Made using more than two notification emails possible
+* Bug Fix: Contact Form: Mitigate a potential stored XSS vulnerability. Thanks
+to Marc-Alexandre Montpas (Sucuri)
+* Bug Fix: General: Mitigate a potential information disclosure. Thanks to
+Jaime Delgado Horna
+* Bug Fix: General: Fixed a locale error in the notifications popout
+* Bug Fix: General: Fixed a possible fatal error in the client area
+* Bug Fix: General: Fixed compatibility issues with certain use cases
+* Bug Fix: General: Disabled connection warnings for multisites with domain
+mapping
+* Bug Fix: General: Updated translations for correct link display in admin
+notices
+* Bug Fix: REST API: Fixed a fatal error in one of the endpoints
+* Bug Fix: Sharing: Fixed OpenGraph tags for Instagram embeds
+* Bug Fix: Sharing: Fixed compatibility issues with bbPress
+* Bug Fix: Widget Visibility: Fixed a fatal error in case of a missing tag
+
+= 3.7.0 =
+Release date: September 9th, 2015
+Release Post: http://wp.me/p1moTy-1JB
+
+Feature Enhancements:
+
+* New admin page interface to easily configure Jetpack
+* Added staging site support for testing a connected Jetpack site
+
+Additional changes:
+
+* Enhancement: CLI: Added a possibility to change all options with
+confirmation for some of them
+* Enhancement: Gallery: Added filters to allow new gallery types to be
+declared
+* Enhancement: General: Added inline documentation for actions, filters, etc.
+* Enhancement: General: Changed class variable declarations keyword from var
+to public
+* Enhancement: General: Made the Settings page module toggle buttons more
+accessible
+* Enhancement: General: The admin bar now loads new notifications popout
+* Enhancement: General: Renamed some modules to avoid redundant prefixes
+* Enhancement: General: Switched to the WordPress Core's spinner image
+* Enhancement: General: Updated the bot list
+* Enhancement: Manage: Added the ability to activate a network-wide plugin on
+a single site from WordPress.com
+* Enhancement: Photon: Added a way to check image URLs against custom domains
+* Enhancement: Photon: Added prompts on the media upload page telling the user
+about Photon
+* Enhancement: Publicize: Added width and height values to OpenGraph tags for
+default images
+* Enhancement: Related Posts: Added a filter to allow disabling nofollow
+* Enhancement: REST API: Added new API endpoints to extend API functionality
+* Enhancement: REST API: Added new fields to existing API endpoints
+* Enhancement: Sharing: Added a possibility to opt-out of sharing for a single
+post
+* Enhancement: Sharing: Added bbPress support
+* Enhancement: Sharing: Added more configuration to the Likes modal
+* Enhancement: Sharing: Made the reddit button open a new tab
+* Enhancement: Sharing: Removed unused files
+* Enhancement: Shortcodes: Added auto embed option inside comments
+* Enhancement: Shortcodes: Added autohide parameter to the YouTube shortcode
+* Enhancement: Subscriptions: added an action that triggers at the end of the
+subscription process
+* Enhancement: VideoPress: Videos are now embedded using a new player
+* Enhancement: Widget Visibility: Added parent page logic
+* Enhancement: Widget Visibility: Added support for split terms
+* Enhancement: Widgets: Added actions to the Social Media widget
+* Enhancement: Widgets: Switched the Display Posts widget to the new API
+version
+* Bug Fix: General: Fixed scrolling to top after modal window closing
+* Bug Fix: Infinite Scroll: Added a check for cases when output buffering is
+disabled
+* Bug Fix: Infinite Scroll: Added translation to the copyright message
+* Bug Fix: Manage: Fixed automatic update synchronization on WordPress
+multisite network admin
+* Bug Fix: Manage: Redirects back to WordPress.com are allowed from the
+customizer view
+* Bug Fix: Media: Fixed duplicate images bug in the Media Extractor
+* Bug Fix: Publicize: Made it possible to remove previously set message
+* Bug Fix: Sharing: Added a thumbnail image to OpenGraph tags on pages with
+DailyMotion embeds
+* Bug Fix: Sharing: Fixed Twitter Cards tags escaping
+* Bug Fix: Sharing: Made OpenGraph tags for title and description use proper
+punctuation
+* Bug Fix: Sharing: Made sure Likes can be disabled on the front page
+* Bug Fix: Shortcodes: Fixed Facebook embeds by placing the scipt in the
+footer
+* Bug Fix: Shortcodes: Fixed PollDaddy shortcode issues over SSL connections
+* Bug Fix: Shortcodes: Made responsive video wrappers only wrap video embeds
+* Bug Fix: Shortcodes: Made SoundCloud accept percents for dimensions
+* Bug Fix: Social Links: Fixed a possible conflict with another class
+* Bug Fix: Stats: Made sure the Stats URL is always escaped properly
+
+= 3.6.1 =
+Release Date: July 24, 2015
+
+* Enhancement: Fully compatible with upcoming WordPress 4.3
+* Enhancement: Site Icon: Start to deprecate Site Icon in favor of Core's
+version (if available)
+* Bug Fix: Subscriptions: You can now use more than one Subscription form on a
+single page
+* Bug Fix: Quieted PHP notices and warnings with the JSON API, Display Posts
+Widget and Gallery Widget (slideshow mode)
+* Bug Fix: Correct permissions check for connection panel
+* Hardening: Increase permissions checks
+
+= 3.6 =
+Release Date: July 6th, 2015
+Release Post: http://wp.me/p1moTy-1ua
+
+Feature Enhancements:
+
+* CLI: Add a number of Jetpack CLI improvements: see
+http://jetpack.com/support/jetpack-cli
+* New Jetpack admin page for connection management
+* New Social Media Icons widget
+* FB Like Box: A visual refresh of the Facebook likebox widget
+* Protect: When your IP is blocked, use a math captcha as a fallback instead
+of a complete block
+
+Additional changes:
+
+* Enhancement: Custom CSS: Add more Flexbox support and other enhancements
+* Enhancement: Extra Sidebar Widgets: Top Posts Widget: Choose what Post Types
+to display
+* Enhancement: General: Save on some requests! print CSS inline when there
+isn't much of it
+* Enhancement: Likes: Likes can now be shown on all post types
+* Enhancement: Minileven: Add Featured Image to Gallery Post Format and Pages
+* Enhancement: Mobile Theme: Add div wrapping View Mobile Site link to allow
+for easier CSS customizations
+* Enhancement: Omnisearch: Link to edit post in titles
+* Enhancement: Protect: Learn Trusted Headers locally and cache blocks
+properly
+* Enhancement: REST API: Add locale support
+* Enhancement: Sharing: Retire StumbleUpon
+* Enhancement: Sharing: Upgrade to reCAPTCHA 2.0 for Email Sharing
+* Enhancement: Shortcode Embeds: Add Mesh oembed support
+* Enhancement: Shortcode Embeds: New Wufoo Shortcode from WordPress.com
+* Enhancement: Shortcode Embeds: Mixcloud: handle accented characters in URLs
+* Enhancement: Site Logo: Adding itemprops to support logo schema.
+* Enhancement: Slideshow Gallery: New parameters *size* and *autostart*
+* Enhancement: Slideshow Gallery: Use more reliable CSS for resizing instead
+of js
+* Enhancement: Stats: No longer track stats for preview pages
+* Enhancement: Tiled Gallery: Improve the shapes and distributions of shapes
+in the Tiled Gallery, based on observations for its usage.
+* Enhancement: Protect: Whitelist for multisite globally and locally
+* Enhancement: Sharing: LinkedIn always uses https for share counts. (saved
+extra http request)
+* Bug Fix: Carousel: Jetpack Carousel now supports HTML5 gallery
+* Bug Fix: Extra Sidebar Widgets: Choose Images button works in accessibility
+mode
+* Bug Fix: General: Fix: Cannot remove hooks from filter
+'jetpack_get_available_modules'
+* Bug Fix: Infinite Scroll: Check that search terms exist before matching
+against post title. fixes #2075
+* Bug Fix: Likes: Never double show on search results
+* Bug Fix: Notifications: Notifications didn't load on wp-admin/network pages
+* Bug Fix: Sharing: Fix Facebook share button not showing for Australian &
+Canadian locale
+* Bug Fix: Shortcode Embed: Slideshare Shortcode now fixed
+* Bug Fix: SSO: Hide login no matter what when using the filter to do so
+* Bug Fix: Subs Widget: Don't hide email input if submit failed
+* Bug Fix: Tiled Gallery: Show columns setting for Thumbnail Grid when Tiled
+Mosaic galleries are the default
+* Bug Fix: Twitter Cards: Remove deprecated card types
+
+= 3.5.3 =
+Release Date: May 6th, 2015
+
+* Security Hardening: Remove Genericons example.html file.
+
+= 3.5.2 =
+Release Date: May 5th, 2015
+
+* Bug Fix: Sharing: Changes Facebook share count endpoint
+
+
+= 3.5.1 =
+Release Date: May 5th, 2015
+
+* Enhancement: Sharing: Changes Facebook share count method per Facebook API
+change
+* Enhancement: General: Remove .po files to reduce plugin size
+* Bug Fix: General: Remove identity crisis notification
+* Bug Fix: Subscriptions: Correct required input validation
+* Security hardening
+
+= 3.5 =
+Release Date: April 23rd, 2015
+Release Post: http://wp.me/p1moTy-1jF
+
+Jetpack 3.5 introduces the ability to manage your site's menus directly from
+WordPress.com and several bug fixes and enhancements. This upgrade is
+recommended for all users.
+
+* Enhancement: General: Change security reporting to use a transient instead
+of option to reduce backup load
+* Enhancement: General: Improve module search
+* Enhancement: JSON API: Allow users to manage menus through WordPress.com
+* Enhancement: Sharing: Reduce spam through email sharing
+* Bug Fix: Custom CSS: Improve recall of CSS revisions
+* Bug Fix: Extra Sidebar Widgets: Change class name for Contact Info widget
+* Bug Fix: Extra Sidebar Widgets: Fix errors when adding widgets via the
+customizer
+* Bug Fix: Extra Sidebar Widgets: Fix PHP notices in RSS widget
+* Bug Fix: General: Fix redirect loop on activation
+* Bug Fix: General: Styling fixes
+* Bug Fix: Protect: Add IP translation fallback when inet_pton is not
+available
+* Bug Fix: Protect: Always allow login from local IDs
+* Bug Fix: Protect: Sanitize displayed IP after block
+* Bug Fix: Publicize: Prevent generating Facebook profile links for app-scoped
+user IDs
+* Bug Fix: Subscriptions: Improve error handling
+* Bug Fix: Theme Tools: Include breadcrumb code
+* Misc: Extra Sidebar Widgets: Remove Readmill Widget
+
+= 3.4.3 =
+Release Date: April 20th, 2015
+Release Post: http://wp.me/p1moTy-1jb
+
+* Security hardening.
+
+= 3.4.2 =
+Release Date: April 19th, 2015
+Release Post: http://wp.me/p1moTy-1j6
+
+* Bug Fix: Contact info widget namespacing
+* Bug Fix: Javascript errors on wp-admin due to stats display code
+* Bug Fix: Potential fatal error from improperly called function
+* Bug Fix: Potential fatal error when protect servers are unreachable for
+WordPress Multisite
+
+= 3.4.1 =
+Release Date: March 19th, 2015
+
+* Bug Fix: General: Modules not displaying properly in non-English installs
+* Bug Fix: Manage: Some installs showing a transient fatal error
+* Bug Fix: Protect: Protect module not auto-activating for users who upgrade
+* Bug Fix: Omnisearch: Some installs not properly reporting WP version number,
+causing Omnisearch error
+* Bug Fix: Stats: Top posts/pages widget not loading
+* Bug Fix: Contact Info Widget: Fix conflict with Avada theme
+
+= 3.4 =
+Release Date: March 18th, 2015
+Release Post: http://wp.me/p1moTy-1fU
+
+* Enhancement: Config Settings: provide a notification for users that update
+features settings
+* Enhancement: Config Settings: provide a notification for users that update
+features settings
+* Enhancement: Contact Form: Use the predefined $title variable in the anchor
+tag in grunion contact form button
+* Enhancement: Contact Form: Use the predefined $title variable in the anchor
+tag in the button on admin
+* Enhancement: Custom Content Type: Add all Custom Post Types to Omnisearch
+* Enhancement: Custom Content Type: Add option to add Testimonial Custom
+Content Type in admin
+* Enhancement: Custom Content Type: bring consistency between the portfolio
+and testimonial shared codebase
+* Enhancement: Custom Content Type: code cleanup
+* Enhancement: Custom Content Type: register namespaced 'jetpack_portfolio'
+shortcode/use a prefix for shortcode for Portfolio
+* Enhancement: Custom Content Type: set shortcode image size to 'large' and
+add jetpack_portfolio_thumbnail_size filter to allow themes to set their own
+size for Portfolio
+* Enhancement: Custom Content Type: testimonial shortcode enhancement
+* Enhancement: Extra Sidebar Widgets: Add subscription widget wildcard
+* Enhancement: Extra Sidebar Widgets: Likes and Sharing Shortcodes
+* Enhancement: Extra Sidebar Widgets: Minor fixes to Facebook widget plugin
+for SSL
+* Enhancement: Fix/update jetpack version
+* Enhancement: General: Add DNS Prefetching
+* Enhancement: General: Add Jetpack admin dashboard widget
+* Enhancement: GlotPress: Update GP_Locales and GP_Locale classes
+* Enhancement: Improved control over Nova Theme Menu output markup
+* Enhancement: Infinite Scroll: Adds a `button` wrapper for the infinity
+handle.
+* Enhancement: Infinite Scroll: Check for response.html before using indexOf
+* Enhancement: Integrate BruteProtect for protection against Brute Force
+attacks
+* Enhancement: JSON API Manage: Added Mock Jetpack Option to Sync options that
+don't have to live in the Database
+* Enhancement: JSON API: Add/empty trash days option to sync
+* Enhancement: Jump Start: Add "Jump Start" interface for new users
+* Enhancement: Manage: Add "modified_before" and "modified_after" parameters
+to /sites/%s/posts/ via JSON API
+* Enhancement: Mobile Theme: Add filter for choosing mobile theme menu
+* Enhancement: Notifications: Changes to load the new notifications client.
+* Enhancement: Protect: Add a filter so that user can add thier own bots
+* Enhancement: Protect: Add security reporting
+* Enhancement: Protect: Add/whitelist endpoints via JSON API for Jetpack
+Protect
+* Enhancement: Publicize: update connection confirmation message
+* Enhancement: Sharing: Add custom service name as a class
+* Enhancement: Sharing: display name of custom service in link title
+* Enhancement: Sharing: Remove default post types for showing share links
+* Enhancement: Sharing: use Jetpack version number when enqueing sharing.js
+* Enhancement: Shortcodes Team Partnerships: Backport fixes from SoundCloud
+2.3.1 through 3.0.2
+* Enhancement: Shortlinks: use HTTPS when possible
+* Enhancement: Stats: Make loading of stats async
+* Enhancement: Subscriptions: Added settings field for comment sub text
+* Enhancement: Subscriptions: Hide Form After Submit
+* Enhancement: Subscriptions: remove label from widget title
+* Enhancement: Subscriptions: Update subscriptions.php
+* Bug Fix: Contact form: Increase CSS specificity for Contact Forms in widgets
+* Bug Fix: Custom Content Type: Testimonial Custom Content Type: use core
+`WP_Customize_Image_Control` instead of custom...
+* Bug Fix: Extra Sidebar Widgets: add missing & to if statement for widget
+visibility
+* Bug Fix: Extra Sidebar Widgets: Don't require height/width values in the
+Twitter Timeline widget
+* Bug Fix: Extra Sidebar Widgets: Upload images from the customizer/Extra
+Sidebar Widgets Tiled Galleries for Gallery Widget
+* Bug Fix: General: Fix bug that was preventing modules from displaying
+properly
+* Bug Fix: Manage: When calling /sites/%s/posts/ include all attachments not
+just the first five via JSON API
+* Bug Fix: Mobile Theme: Minileven; Start after DOM ready
+* Bug Fix: Sharing: Open sharing in same window
+* Bug Fix: Stats language
+* Bug Fix: Subscritpions: fix invalid field when no email address
+
+
+= 3.3.2 =
+Release Date: February 19th, 2015
+
+* Enhancement: Updated translation files.
+* Enhancement: Heartbeat: Correctly stat new datasets.
+* Bug Fix: Widget Visibility: Correct some caching of visibility results that
+may get evaluated too soon.
+* Bug Fix: Contact Form: Hardening.
+* Bug Fix: Photon: Make sure our gallery filter can parse array inputs as well
+as the default html.
+
+= 3.3.1 =
+Release Date: February 11th, 2015
+
+* Bug Fix: JSON API: Minor versioning data.
+* Bug Fix: Markdown: Re-run KSES after processing to account for syntax
+changes.
+* Bug Fix: Media Extractor: Don't call a gallery a gallery if it hasn't got
+any pictures!
+* Bug Fix: Module Management: Handle a core api change for folks running
+trunk.
+* Bug Fix: Related Posts: CSS -- better clear rows.
+* Bug Fix: Sharing: Including sharing account on Pinterest unofficial buttons
+as well.
+* Bug Fix: Sharing: Properly version external assets by Jetpack release
+version.
+* Bug Fix: Shortcodes: Soundcloud: Backport API compatibility fixes.
+* Bug Fix: Shortcodes: Flickr: Tidy up our regex url pattern matching.
+* Bug Fix: Subscriptions: Don't add 'Email Address' as the value -- we have
+placeholders!
+* Bug Fix: Widgets: Gallery Widget: Allow folks to upload images from the
+widget area in the customizer.
+
+= 3.3 =
+Release Date: December 15th, 2014
+Release Post: http://wp.me/p1moTy-1aF
+
+* Enhancement: Adds responsive video support to BuddyPress.
+* Enhancement: Custom Content Types: Added 'order' and 'orderby' options to
+portfolio shortcode.
+* Enhancement: Display notice when Jetpack Development Mode is on.
+* Enhancement: General: Update compatibility with Twenty Fifteen.
+* Enhancement: Image URL can now be overwritten with the
+`jetpack_images_fit_image_url_override` filter after dimensions are set by
+Photon.
+* Enhancement: JSON API: Add Endpoint for trigger Plugin Autoupdates.
+* Enhancement: JSON API: General Improvements. Documentation on
+http://developer.wordpress.com/
+* Enhancement: Likes: Updated the code to accept arbitrary CPTs.
+* Enhancement: Related Posts: Allow filter by `post_format`.
+* Enhancement: Sharing: add new `jetpack_sharing_counts` filter for option to
+turn off sharing counts.
+* Enhancement: Sharing: Use the Site Logo Theme Tool and the Site Icon as
+fallbacks for image tags.
+* Enhancement: Shortcodes: Made the code more readable by using output buffers
+instead of string concatenation.
+* Enhancement: Site Logo: Add alias functions to provide backward
+compatibility for themes expecting the old function calls.
+* Enhancement: Slideshow: Add title and alt text to images.
+* Enhancement: Subscription Form: Do not display the logged in user's email
+address by default.
+* Enhancement: Top Posts Widget: Refactor to allow conditional loading of the
+css.
+* Enhancement: Top Posts: Add `jetpack_top_posts_widget_count` filter to
+control number of displayed posts.
+* Bug Fix: Change subscribe_text from `p` to `div` so that it can contain
+block-level elements.
+* Bug Fix: Fonts: Change path to look for the svg in the right directory.
+* Bug Fix: Increase CSS specificity for Contact Forms in widgets.
+* Bug Fix: JSON API: Plugins Update: Make sure the plugin doesn't get
+deactivated.
+* Bug Fix: Likes: Fixes issues where likes don't load, load master iframe
+after scripts are loaded.
+* Bug Fix: Notes Module: Avoid a PHP Notice in cli scripts when the request
+doesn't contain a User-Agent header.
+* Bug Fix: Nova Menu CPT: fix notice when we have no taxonomies.
+* Bug Fix: Nova Menus: Use current instance to maintain object context.
+* Bug Fix: Related Posts: Add filter for `_enabled_for_request()`.
+* Bug Fix: Sharing: Prevent duplicate @ in shared Tweets.
+* Bug Fix: Site Logo: `get_site_logo()` now properly returns the site logo ID
+when provided in the `$show` argument.
+* Bug Fix: Site Logo: Correct evaluation of the Display Header Text in
+Customizer preview.
+
+= 3.2.1 =
+Release Date: November 14th, 2014
+
+* Enhancement: Updated translation files.
+* Enhancement: JSON API: More object vars passed back to some queries.
+Documentation on http://developer.wordpress.com/
+* Bug Fix: JSON API: Pass back correct author in `me/posts` data.
+* Bug Fix: JSON API: Don't check if a post is freshly pressed on remote
+Jetpack sites where the function doesn't exist.
+* Bug Fix: Site Logo: Add backward-compatible template tags to match the
+standalone release.
+* Bug Fix: Don't use __DIR__ -- it's 5.3+ only, and WordPress supports back to
+5.2.
+* Bug Fix: Retool how we remove the source styles when using the concatenated
+version.
+* Bug Fix: Shortcodes: TED: Correct default language code from `eng` to `en`.
+* Bug Fix: Gallery Widget: Add a default background color.
+* Bug Fix: Subscription Notifications: Remove the label.
+* Bug Fix: Sharing: enqueue Genericons on static front page as well if
+selected.
+
+= 3.2 =
+Release Date: October 29, 2014
+Release Post: http://wp.me/p1moTy-181
+
+* Enhancement: Speed Improvements (woohoo!).
+* Enhancement: Add site icons: an avatar for your blog.
+* Enhancement: Improvements to API endpoints.
+* Enhancement: Add oEmbed sources (Twitter, SoundCloud, Instagram,
+DailyMotion, Vine).
+* Enhancement: Add indicators to make it easier to see which modules are
+active.
+* Enhancement: Improve debug tool.
+* Enhancement: Add new 'Site Logos' code to theme tools, for themes that opt
+in to support it.
+* Enhancement: Improved caching for related posts.
+* Enhancement: Added "Remember Me" functionality to Single Sign On.
+* Enhancement: Improved accessibility.
+* Enhancement: Added additional filters to Widget Visibility.
+* Bug Fix: Fixed PHP Notice errors for Likes, Widget Visibility.
+* Bug Fix: Improvements to the testimonials CPT.
+* Bug Fix: Improved RTL on VideoPress admin.
+* Bug Fix: Removed Google+ Authorship module (discontinued by Google).
+* Bug Fix: Fixed use of deprecated function in mobile theme.
+* Bug Fix: Various fixes to Tiled Galleries.
+* Bug Fix: Various fixes to Contact Form.
+* Bug Fix: Various fixes to oEmbed.
+* Bug Fix: Various fixes to Single Sign On.
+* Bug Fix: Fixed styles in ShareDaddy.
+* Bug Fix: Better match protocols (http/https) to the site.
+
+
+= 3.1.1 =
+Release Date: August 7, 2014
+
+* Enhancement: Update translation files for strings that had been
+submitted/approved since release.
+* Bug Fix: Social Links: Add a function check to better degrade if Publicize
+isn't around.
+* Bug Fix: Open Graph: Add WordPress SEO back to the blacklist, until they
+update how they opt us out.
+* Bug Fix: Asset Minification: Add another caveat ( empty $plugin ) to short
+out on.
+* Bug Fix: Deprecated Hooks: Fixing our expectations where something that
+should be an array occasionally wasn't.
+* Bug Fix: Custom CSS: Add extra whitelist rule for -o-keyframe rules.
+
+= 3.1 =
+Release Date: July 31, 2014
+Release Post: http://wp.me/p1moTy-129
+
+* Enhancement: New Custom Content Types module.
+* Enhancement: New Jetpack Logo.
+* Enhancement: New optional JSON API endpoints for viewing updates and
+managing plugins and themes.
+* Enhancement: New Custom Post Type: Portfolio!
+* Enhancement: Rearranged buttons on the modules modals for easier management.
+* Enhancement: Jetpack Settings have improved keyboard accessibility.
+* Enhancement: Improved RTL support for After the Deadline, Carousel, Contact
+Form, Comics CPT, Custom CSS, Omnisearch, Publicize, Related Posts, Slideshow
+short code, Tiled Gallery, Widget-Visibility and Widgets Gallery.
+* Enhancement: Contact Form: Add an "Empty Spam" option.
+* Enhancement: i18n: Change the priority of where plugin_textdomain is hooked
+so that the plugins can better translate Jetpack.
+* Enhancement: Monitor: Displays how often the site is checked for downtime.
+* Enhancement: Shortcode: Added Mixcloud shortcode and oEmbed support.
+* Enhancement: Social Links: Improved handling of customizer hooks in
+non-admin context.
+* Enhancement: Stats: The smiley image is gone by default.
+* Enhancement: Stats: Added link to the configure page for stats so that the
+stats settings page is easier to find.
+* Enhancement: Theme Tools: Added the responsive videos to theme tools so that
+themes can support responsive videos more easily.
+* Update: Updated Genericons to version 3.1, new icons for website, ellipsis,
+foursquare, x-post, sitemap, hierarchy and paintbrush.
+* Bug Fix: Contact Form: Prefix function to avoid conflicts with other
+plugins.
+* Bug Fix: Custom CSS: Admin UI has a responsive layout.
+* Bug Fix: Custom CSS: Custom $content_width value doesn't overwrite theme's
+$content_width.
+* Bug Fix: Contact Form: Feedback link takes you to the form page.
+* Bug Fix: Carousel: Confirms an avatar is returned by get_avatar before
+displaying.
+* Bug Fix: Featured Content: Don't remove setting validation.
+* Bug Fix: Infinite Scroll: Google Universal Analytics support added.
+* Bug Fix: Multisite: Add message when updating multisite settings.
+* Bug Fix: Photon: Photon will no longer upscale images larger than the
+original size.
+* Bug Fix: Photon: Check that the image exists before rewriting the image URL
+to utilize Photon.
+* Bug Fix: Sharing: Pinterest adds attribute to display share count.
+* Bug Fix: Sharing: Respect an empty sharing title.
+* Bug Fix: Sharing: Share buttons now appear in the bbPress forms.
+* Bug Fix: Sharing: Support for multiple meta html tag og:image values.
+* Bug Fix: Single Sign On: Logout allows override of forcing Single Sign On.
+* Bug Fix: Single Sign On: Remove the lost password link on auto-forward
+logout.
+* Bug Fix: Social Links: Do not use anonymous function for compatibility with
+PHP 5.2.
+* Bug Fix: Tiled Galleries: Update jQuery mouseover caption effect to reduce
+flickering.
+* Bug Fix: Widgets Visibility: Works better in the customizer admin view.
+
+= 3.0.2 =
+Release Date: June 17, 2014
+
+* Enhancement: General: Make module categories filter more visible when
+active.
+* Enhancement: General: Updated translation files with more strings added
+since the last release.
+* Enhancement: General: Allow deep-linking to the Contact Support form.
+* Bug Fix: General: RTL Jetpack Admin UI looks better.
+* Bug Fix: General: Fixed PHP warning when bulk deactivating modules.
+* Bug Fix: General: Removed an unnecessary description.
+* Bug Fix: General: Resolved an SSL error on Jetpack Admin UI.
+* Bug Fix: General: Fix error comparing signatures when the WordPress
+installation is using site_url filters (applied mostly to WPEngine sites).
+* Bug Fix: General: Resolved PHP strict error on the mobile menu.
+* Bug Fix: General: Fix timing of conditional checks, so that calling
+developer mode via a plugin works again.
+* Bug Fix: General: Main page categories tab now properly translates module
+names.
+* Bug Fix: Related Posts: Fix a typo, the "more info" link now works.
+* Bug Fix: Likes: Improve button styling.
+* Bug Fix: Likes: Remove unused UI for Reblog settings on social settings
+page.
+* Bug Fix: Contact Form: Updated to no longer use a deprecated Akismet
+function.
+* Bug Fix: Contact Form: Sends email to the administrator that is not marked
+as spam again.
+* Bug Fix: Open Graph: Resolved PHP warning on open graph gallery pages when
+the gallery is empty.
+
+= 3.0.1 =
+Release Date: May 22, 2014
+
+* Bug Fix: AtD: A wpcom-only function got synced by mistake and caused a few
+errors. Fixed.
+* Bug Fix: Post By Email: Add static keyword to a function.
+* Bug Fix: ShareDaddy: In the admin-side configuration of sharing links, we
+used a Path icon instead of Pinterest. Oops!
+* Bug Fix: ShareDaddy: We inadvertently appended `via @jetpack` to some
+twitter shares. This is no longer the case.
+* Bug Fix: Related Posts: Tidying up and relocation of the `resync` button
+formerly on the more info modal.
+* Bug Fix: Infinite Scroll: Work better with core's MediaElement.js
+* Bug Fix: Heartbeat: Undeclared variable fixed.
+
+= 3.0 =
+Release Date: May 20, 2014
+Release Post: http://wp.me/p1moTy-Wi
+
+* New User Interface for managing modules and settings
+* New Module: Verfication Tools
+* Enhancement: New look for the Sharing module
+* Enhancement: Multiple improvements on which Twitter handle a Twitter card
+will display
+* Enhancement: Add option to hide Google+ Authorship banner while still
+receiving the benefits
+* Enhancement: Many Infinite Scroll enhancements to improve performance
+* Enhancement: Infinite Scroll will use your CPT's display name instead of
+"Older Posts"
+* Enhancement: JSON API added /media/new endpoint
+* Enhancement: Added filter to assign new default image for Open Graph tags
+* Enhancement: New [jetpack-related-posts] shortcode to add Related Posts to
+page instead of default placement
+* Enhancement: Added SSO option to turn off login form completely, to use
+WordPress.com login exclusively
+* Enhancement: The [googlemaps] shortcode allows for Google Maps Engine
+* Enhancement: YouTube shortcode allows HD playback
+* Enhancement: Smoother, Faster Tiled Galleries!
+* Enhancement: New languages! Use Jetpack in Irish, Fulah, and Tigrinya
+* Bug Fix: Use your browser's Back and Forward buttons when naviagating a
+Carousel
+* Bug Fix: Various Related Posts fixes and improvements for added flexibility
+* Bug Fix: WordPress 3.9: Restores ability to edit Contact Forms
+* Bug Fix: WordPress 3.9: Restores Gallery Widget compatability
+* Bug Fix: Ensure Markdown is kept when Bulk Editing posts
+* Bug Fix: Improved Jetpack's Multisite Network Admin page for networks with a
+large number of sites
+* Bug Fix: Ensure Sharing settings persist when Bulk Editing a post
+* Bug Fix: Various other shortcode improvements
+
+= 2.9.3 =
+Release Date: April 10, 2014
+Release Post: http://wp.me/p1moTy-U2
+
+* Important security update. CVE-2014-0173
+
+= 2.9.2 =
+Release Date: March 17, 2014
+
+* Bug Fix: Publicize: When publishing from a mobile app or third-party client,
+Publicize now works again.
+
+= 2.9.1 =
+Release Date: March 6, 2014
+
+* Bug Fix: After the Deadline: Fix a Javascript glitch that could prevent
+publishing of posts.
+* Bug Fix: SSO: Disable the implementation of an option that had been removed
+before release. This would have only been an issue if a site administrator
+had enabled the module during an early beta of 2.9.
+
+= 2.9 =
+Release Date: February 26, 2014
+Release Post: http://wp.me/p1moTy-RN
+
+* Added Multisite network functionality
+* New Module: Related Posts
+* Enhancement: Single Sign On
+* Enhancement: Mixcloud shortcode and oEmbed
+* Enhancement: Gist shortcode and oEmbed
+* Enhancement: Modify Facebook Like Box widget to support new Facebook
+parameters
+* Enhancement: Rolled the Push Notifications module into the Notes module
+* Enhancement: Update kses with Markdown
+* Enhancement: Adding keyboard accessibility to sharing buttons config page
+* Enhancement: Pull WordPress testing bits from the new official git mirror at
+WordPress.org
+* Bug Fix: Widget Visibility
+* Bug Fix: Revisions box in Custom CSS
+* Bug Fix: Fix several bugs in the WordPress Posts Widget so that it correctly
+updates
+* Bug Fix: Limit Login Attempts no longer generates false positives from
+xmlrpc.
+* Bug Fix: Clear max_posts transient on theme switch.
+* Bug Fix: Lower priority of sync to allow all CPTs to be registered.
+* Bug Fix: Contact form fields emailed in correct order.
+
+* Other bugfixes and enhancements at
+https://github.com/Automattic/jetpack/commits/2.9
+
+= 2.8 =
+Release Date: January 31, 2014
+Release Post: http://wp.me/p1moTy-Pd
+
+* New Module: Markdown
+* Module Update: Jetpack Monitor
+* Enhancement: Infinite Scroll: Keep track of $current_day between requests so
+the_date() works well.
+* Enhancement: Embeds: New filter to turn off embeds in comments.
+* Enhancement: Contact Form: Add placeholder support.
+* Enhancement: Widget: Gravatar Profile: Added filters to allow users to
+customize headings and fixed output of personal links.
+* Enhancement: Facebook OG Tags: Add `published_time`, `modified_time`, and
+`author` if the post type supports it.
+* Enhancement: Sharing: Display buttons on CPT archive pages.
+* Enhancement: Sharing: Add `get_share_title` function and filter.
+* Enhancement: Sharing: Add filter `sharing_display_link`.
+* Enhancement: Twitter Timeline: Flesh out tweet limit option.
+* Enhancement: Social Links: Add Google+ to the list of supported services.
+* Enhancement: Stats: Improve dashboard styles in 3.8.
+* Enhancement: Stats: No longer use Quantcast.
+* Enhancement: Top Posts: Add `jetpack_top_posts_days` filter.
+* Enhancement: AtD: Add TinyMCE 4 compatibility for its pending arrival in
+WordPress 3.9
+* Enhancement: Genericons: Update to v3.0.3
+* Enhancement: Tiled Galleries: Add alt attributes to images.
+* Enhancement: Shortcode: YouTube: Accept protocol-relative URLs.
+* Enhancement: Shortcode: Slideshow: Add white background option.
+* Enhancement: Shortcode: YouTube: Add support for the two closed-caption
+arguments.
+* Enhancement: Shortcode: Vimeo: Update the regex to support the new embed
+code.
+* Enhancement: Shortcode: Google Maps: Update the regex to handle new format
+for embeds.
+* Enhancement: Likes: Avoid a PHP Notice when $_POST['post_type'] is not set
+in meta_box_save.
+* Enhancement: Smush images to save on file size.
+* Enhancement: Publicize: Enable opt-in publicizing of custom post types.
+* Bug Fix: Random Redirect: Further namespace to avoid conflicts.
+* Bug Fix: Twitter Timeline: Resolve undefined index notice.
+* Bug Fix: Featured Content: Add extra class_exists() check to be extra
+careful.
+* Bug Fix: Facebook OG Tags: Change OG type of Home and Front Page to
+'website'
+* Bug Fix: Widget Visibility: Add support for old-style single use widgets.
+* Bug Fix: Google Authorship: Support apostrophe in author names.
+* Bug Fix: Media Extractor: Assorted graceful failure caveats.
+* Bug Fix: Carousel: 'Link to None' bug fixed.
+* Bug Fix: Embeds: Bandcamp: Switch escaping function for album and track IDs
+to handle (int)s greater than PHP_INT_MAX
+* Bug Fix: Some plugins trying to catch brute-force attacks mistakenly flagged
+the Jetpack connection as one.
+
+= 2.7 =
+Release Date: December 11, 2013
+Release Post: http://wp.me/p1moTy-Mk
+
+* Enhancement: Google+ Publicize
+* Enhancement: Add Cloudup as an oEmbed provider
+* Enhancement: Subscriptions: Add subscribe_field_id filter to allow updated
+ids when using multiple widgets
+* Enhancement: Infinite Scroll: TwentyFourteen Support
+* Bug Fix: Contact Form: Fix warning when form is called outside the loop
+* Bug Fix: Featured Content: Moving Settings to Customizer, provide option to
+set default tag as fallback, specify all supported post-types rather than just
+additional ones. Description Updates
+* Bug Fix: Featured Content: Compat with 'additional_post_types' theme support
+argument. Comment updates
+* Bug Fix: Featured Content: Make sure $term is an object before we treat it
+as one
+* Bug Fix: GlotPress: Merge with latest GlotPress
+* Bug Fix: Infinite Scroll: prevent Undefined index notice that can cause IS
+to fail when user has WP_DEBUG set to true
+* Bug Fix: Infinite Scroll: Improved compatibility with Carousel, Tiled
+Galleries, VideoPress, and the `[audio]` and `[video]` shortcodes
+* Bug Fix: Likes: Stop manually including version.php and trust the global.
+Some whitespace fixes, and if it's an attachment, follow the post_status of
+the parent post
+* Bug Fix: Mobile Theme: Display password field for Gallery format protected
+posts
+* Bug Fix: Sharing: Add new translation width for share button, and Google
+Plus icons
+* Bug Fix: Shortcodes: Support Ineternational Google domains for maps
+* Bug Fix: Shortcodes: Facebook Embeds: Register alternate permalink.php URL
+for posts
+* Bug Fix: Subscriptions: Moved inline styles from widget email input to
+separate css file
+* Bug Fix: Theme Tools: Fix glitch where random-redirect.php also showed as a
+plugin being deleted if you were deleting Jetpack
+* Bug Fix: Misc: Internationalization & RTL updates
+* Bug Fix: Misc: Prevent collisions with 'Facebook Featured Image & OG Meta
+Tags' plugin
+
+= 2.6.1 =
+Release Date: December 3, 2013
+
+* Bug Fix: minor styling fix in pre- and post-MP6/3.8 UI changes.
+* Bug Fix: Stats: spinner gif url fix when the user is viewing it over https.
+* Bug Fix: Stats: Switch to esc_html from htmlspecialchars in error message --
+better to be native
+* Bug Fix: Media Extractor: some hosts don't compile unicode for
+preg_match_all, so we temporarily removed the block that depended on it.
+* Bug Fix: Media Extractor: Add in some error handling for malformed URLs.
+* Bug Fix: Twitter Cards: treat single-image galleries as a photo-type.
+* Bug Fix: Update conflicting plugins for OG tags and Twitter Cards.
+* Bug Fix: Correct max supported version number -- had been 3.6, update to
+3.7.1
+
+= 2.6 =
+Release Date: November 28, 2013
+Release Post: http://wp.me/p1moTy-KE
+
+* Enhancement: WPCC / now called [SSO](http://jetpack.com/support/sso/):
+refactored.
+* Enhancement: Monitor: new module which will notify you if your site goes
+down(http://jetpack.com/support/monitor/).
+* Enhancement: Custom CSS: replace Ace editor with Codemirror.
+* Enhancement: Widgets: new “Display Posts” widget.
+* Enhancement: WP-CLI: add commands to disconnect a site and manage modules.
+* Enhancement: Contact Form: new filters, `grunion_contact_form_field_html`
+and `grunion_should_send_email`.
+* Enhancement: Custom Post Types: new restaurant post type.
+* Enhancement: Genericons: update to version 3.0.2.
+* Enhancement: Infinite Scroll: many improvements and fixes.
+* Enhancement: Likes: performance improvements.
+* Enhancement: MP6: Jetpack icons are now compatible with WordPress 3.8.
+* Enhancement: Open Graph: better descriptions, fallback images, and media
+extraction from video posts.
+* Enhancement: Publicize: new background token tests for connected publicize
+services and display problems on settings sharing and add new post.
+* Enhancement: Shortcodes: updated Bandcamp shortcode to support the
+`tracklist` and `minimal` attributes, as well as more `artwork` attribute
+values.
+* Enhancement: Shortlinks: add Custom Post Type support.
+* Enhancement: Subscriptions: add more ways to customize the subscriptions
+widget.
+* Enhancement: Twitter Cards: better media management and card type detection,
+and better handling of conflicts with other Twitter Cards plugins.
+* Enhancement: better handling of conflicts with other plugins.
+* Bug Fix: After the Deadline: add a typeof check for `tinyMCEPreInit.mceInit`
+to prevent js errors.
+* Bug Fix: Carousel: speed improvements and several bugfixes.
+* Bug Fix: Contact Form: remove nonce creating issues with caching plugins.
+* Bug Fix: Custom Post Types: Testimonials: return if featured image is empty
+so it can be removed after it’s been set.
+* Bug Fix: Featured Content: add additional post type support through the
+`additional_post_types` argument.
+* Bug Fix: Google Authorship: support apostrophes in Google+ profiles.
+* Bug Fix: Google Authorship: use a regexp Instead of using
+`mb_convert_encoding`, which doesn’t enjoy universal support.
+* Bug Fix: Heartbeat: ensure that it never triggers more than once per week.
+* Bug Fix: JSON API: add new `?meta=` parameter that allows you to expand the
+data found in the `meta->links` responses.
+* Bug Fix: JSON API: add new `is_private` response to the sites endpoint and
+`global_ID` response to the reader and post endpoints.
+* Bug Fix: Mobile Theme: allow small images to display inline.
+* Bug Fix: Mobile Theme: fix fatal errors for missing `minileven_header`
+function.
+* Bug Fix: Photon: fix errors when an image is not uploaded properly.
+* Bug Fix: Shortcodes: improvements to Archives, Google+, Presentations, Vine
+and Youtube.
+* Bug Fix: Tiled Galleries: improve display of panoramic images and fix errors
+when an image is not uploaded properly.
+
+= 2.5 =
+Release Date: September 19, 2013
+Release Post: http://wp.me/p1moTy-xS
+
+* Enhancement: Connect your Google+ profile and WordPress site to prove
+authorship of posts.
+* Enhancement: Improved sharing buttons display.
+* Enhancement: Comment on your posts using Google+ to signin.
+* Enhancement: Embed Google+ posts into your posts.
+* Enhancement: Added event logging capabilities for debugging
+* Enhancement: LaTeX is now available in dev mode
+* Enhancement: Introduced gallery widget
+* Enhancement: Added new module: VideoPress
+* Enhancement: Updated identity crisis checker
+* Enhancement: Tiled Gallery widget added
+* Enhancement: Google +1 button changed to Google+ Share button, to avoid
+confusion
+* Enhancement: Added check to ensure Google+ authorship accounts have
+disconnected properly
+* Enhancement: Updated identity crisis checker
+* Enhancement: Tiled Gallery widget added
+* Enhancement: Google +1 button changed to Google+ Share button, to avoid
+confusion
+* Enhancement: Added the ability to embed Facebook posts
+* Bug Fix: Redirect issue with G+ authorship when WordPress is not in the root
+directory
+* Enhancement: Better security if carousel to prevent self-XSS
+* Enhancement: Better handling of cookies for subsites on multisite installs
+* Bug Fix: Check for post in G+ authorship before accessing it
+
+= 2.4.2 =
+Release Date: September 5, 2013
+
+* Enhancement: Converted to module headers to detect Auto-Activating modules.
+* Enhancement: WPCC: Added 'Close' link to deactivate WPCC in the admin nag.
+* Enhancement: JSON API: Add User Nicename to the user data.
+* Bug Fix: Contact Form: Stopped using a short tag.
+* Bug Fix: Changed CSS selector to catch MP6 stylings.
+* Bug Fix: Dropped __FILE__ references in class.jetpack.php in favor of
+JETPACK__PLUGIN_DIR constant, now code that deactivates the plugin from the
+connect nag works again.
+* Bug Fix: Random Redirect: Add random-redirect to the plugins overriden list,
+in case someone is using Matt's Random Redirect plugin.
+* Bug Fix: Tiled Gallery: Revert r757178 relating to tiled gallery defaults.
+* Bug Fix: Return false, not zero, if $GLOBALS['content_width'] isn't defined.
+* Bug Fix: WPCC: Don't call wp_login_url() in the constructor -- if someone is
+running a custom login page, that can break things if their plugin runs
+get_permalink as a filter before init.
+* Bug Fix: Tiled Gallery: Add fallback if post_parent == 0 due to
+infinite_scroll_load_other_plugins_scripts.
+* Bug Fix: Custom CSS: Set the ACE gutter z-index to 1.
+* Bug Fix: Custom Post Types: Switch from wp_redirect() to wp_safe_redirect().
+* Bug Fix: Likes: Set overflow:hidden; on the likes adminbar item.
+* Bug Fix: Mobile Theme: Migrate where/when the custom header stuff is
+included.
+* Bug Fix: Slideshow Shortcode: Add a height of 410px.
+
+= 2.4.1 =
+Release Date: September 4, 2013
+
+* Enhancement: Don't auto-activate WPCC.
+
+= 2.4 =
+Release Date: August 30, 2013
+Release Post: http://wp.me/p1moTy-wv
+
+* Enhancement: WordPress.com Connect (WPCC): New Module.
+* Enhancement: Widget Visibility: New Module.
+* Enhancement: Shortcode: Addition of new Twitter Timeline shortcode.
+* Enhancement: Shortcode: Addition of new Presentation shortcode.
+* Enhancement: Shortcode: Addition of new Vine shortcode.
+* Enhancement: Custom Post Types: CPTs are available.
+* Enhancement: Subscriptions: Add 'jetpack_is_post_mailable' filter.
+* Enhancement: OpenGraph: Add Twitter Cards meta tags as well.
+* Enhancement: Custom CSS: Update lessc and scssc preprocessors to 0.4.0 and
+0.0.7 respectively.
+* Enhancement: Omnisearch: Add Media results.
+* Enhancement: Likes: Use a protocol-agnostic iframe, instead of forced HTTPS.
+* Enhancement: Top Posts: Increase post limit.
+* Enhancement: Publicize: Updated JS and UI.
+* Enhancement: Photon: New filter to let site admins/owners enable photon for
+HTTPS urls.
+* Enhancement: New jetpack_get_available_modules filter.
+* Enhancement: Subscriptions: Antispam measures.
+* Bug Fix: Add inline style to keep plugins/themes from inadvertently hiding
+the Connect box.
+* Bug Fix: Custom CSS: Respect the new wp_revisions_to_keep filter.
+* Bug Fix: Photon: Only hook jetpack_photon_url into the filter if the user
+has Photon active.
+* Bug Fix: Heartbeat: Used wrong object, occasinally fatal-erroring out for
+the cron.
+* Bug Fix: Add an empty debug.php file to the /modules/ folder, to solve some
+update issues where it never got deleted.
+
+= 2.3.5 =
+Release Date: August 12, 2013
+Release Post: http://wp.me/p1moTy-vf
+
+* Enhancement: Added Path support to Publicize.
+
+= 2.3.4 =
+Release Date: August 6, 2013
+Release Post: http://wp.me/p1moTy-uL
+
+* Bug Fix: Correct when output occurs with CSV export for feedback.
+* Bug Fix: Tidy up the Heartbeat API.
+* Enhancement: User Agent: Improve detecting of bots.
+* Enhancement: Genericons: Make sure we're pulling the freshest version from
+genericons.com on each release.
+* Enhancement: JSON API: Open up replies/new endpoints so that users can
+comment on blogs that are not in their access token.
+* Enhancement: Photon: Apply to `get_post_gallery()` function as well.
+* Enhancement: Tiled Galleries: Add a default bottom margin to be more robust
+out of the box.
+* Translations: Adding in fresher translation files.
+* Deprecation: Removing the retinization code for 3.4, as it was included in
+WordPress trunk from 3.5 onwards.
+
+= 2.3.3 =
+Release Date: July 26, 2013
+Release Post: http://wp.me/p1moTy-uv
+
+* Bug Fix: We were inadvertently overwriting cron schedules with our Jetpack
+heartbeat. This should now be fixed.
+* Enhancement: New Facebook Sharing icons.
+* Enhancement: Minor update to the Minileven stylesheet.
+
+= 2.3.2 =
+Release Date: July 25, 2013
+Release Post: http://wp.me/p1moTy-uv
+
+* Bug Fix: Fixed an issue where Facebook Pages were not available when
+connecting a Publicize account.
+* Bug Fix: For some web hosts, fixed an issue where 'Jetpack ID' error would
+occur consistently on connecting to WordPress.com.
+* Enhancement: Adding some new stats and heartbeat checking to Jetpack.
+
+= 2.3.1 =
+Release Date: July 2, 2013
+Release Post: http://wp.me/p1moTy-t9
+
+* Enhancement: Social Links: Retooling the class for better consistency and
+performance behind the scenes.
+* Enhancement: Omnisearch: Make it easier to search Custom Post Types. No
+longer need to extend the class, if all you want is a basic display. Just
+call `new Jetpack_Omnisearch_Posts( 'cpt' );`
+* Enhancement: Sharing Buttons: LinkedIn: Use the official button's sharing
+link on the Jetpack implementation for a more consistent sharing experience
+and produce better results on LinkedIn's end.
+* Enhancement: Debug / Connection: Better logic in determining whether the
+server can use SSL to connect to WPCOM servers.
+* Enhancement: Sharing: Twitter: Calculate the size of the Tweet based on the
+short URL rather than the full URL size.
+* Enhancement: Debug: More readable and understandable messages.
+* Enhancement: Likes: Including some MP6 styles.
+* Enhancement: Comments: Add new core classes to comment form. See
+http://core.trac.wordpress.org/changeset/24525
+* Bug Fix: Omnisearch: Don't load everything initially, run the providers off
+admin_init, and then issue an action for folks to hook into.
+* Bug Fix: Omnisearch: Modify some child class functions to match the parent's
+parameters and avoid strict notices in newer versions of PHP.
+* Bug Fix: Omnisearch: Hide the search form in the module description if the
+current user can't use it.
+* Bug Fix: Comment Form: Use edit_pages, not edit_page (fixes glitch in
+previous beta, never publicly released).
+* Bug Fix: Twitter Timeline Widget: Additional testing of values and casting
+to default if they are nonconforming.
+* Bug Fix: Sharing: Pinterest: Make the button wider if there's a count to
+avoid overlapping with others.
+* Bug Fix: Post By Email: Change configuration_redirect to static.
+* Bug Fix: Likes: Don't call configuration_redirect as a static, do it as a
+method.
+* Bug Fix: Add some further security measures to module activation.
+
+= 2.3 =
+Release Date: June 19, 2013
+Release Post: http://wp.me/p1moTy-rX
+
+* Enhancement: Omnisearch: Search once, get results from everything!
+Omnisearch is a single search box that lets you search many different things
+* Enhancement: Debugger: this module helps you debug connection issues right
+from your dashboard, and contact the Jetpack support team if needed
+* Enhancement: Social Links: this module is a canonical source, based on
+Publicize, that themes can use to let users specify where social icons should
+link to
+* Enhancement: It’s now easier to find out if a module is active or note,
+thanks to the new Jetpack::is_module_active()
+* Enhancement: Contact Form: You are now able to customize the submit button
+text thanks to the submit_button_text parameter
+* Enhancement: Comments: We've added a filter to let users customize the
+Comment Reply label, and users can now also customize the prompt on the
+comment form again.
+* Enhancement: Mobile Theme: Add genericons.css and registering it so it’s
+easily accessible to other modules that may want it
+* Enhancement: Tiled Galleries: You can now customize the captions, thanks to
+the jetpack_slideshow_slide_caption filter
+* Enhancement: Widgets: Twitter Timeline: Add the noscrollbar option
+* Enhancement: Widgets: Facebook Like Box Widget: add a show_border attribute
+* Enhancement: Widgets: FB Like Box: let Jetpack users override the iframe
+background color set in an inline style attribute by using the
+jetpack_fb_likebox_bg filter
+* Bug Fix: Carousel: Fix a bug where double-clicking a gallery thumbnail broke
+the carousel functionality
+* Bug Fix: Comments: Change “must-log-in” to class from ID
+* Bug Fix: Contact Form: Make the Add Contact Form link a button, ala Add
+Media in core
+* Bug Fix: Contact Form: Fix encoding of field labels
+* Bug Fix: Contact Form: Remove references to missing images
+* Bug Fix: Fix 2 XSS vulnerabilities
+* Bug Fix: JSON API: Minor fixes for bbPress compatibility
+* Bug Fix: JSON API: Fix metadata bugs
+* Bug Fix: JSON API: Add a new hook that is fired when a post is posted using
+the API
+* Bug Fix: JSON API: Prefork/REST: update path normalizer to accept versions
+other than 1
+* Bug Fix: JSON API: Remove extra parenthesis in CSS
+* Bug Fix: Custom CSS: Move content width filters higher up so that they’re
+active for all users, not just logged-in admins.
+* Bug Fix: Custom CSS: All CSS properties that accept images as values need to
+be allowed to be declared multiple times so that cross-browser gradients work
+* Bug Fix: Infinite Scroll: Allow themes to define a custom function to render
+the IS footer
+* Bug Fix: Infinite Scroll: Fix up Twenty Thirteen styles for RTL and small
+viewports.
+* Bug Fix: Likes: Fix ‘Call to undefined function’
+* Bug Fix: Likes: Add scrolling no to iframe to make sure that like button in
+admin bar does not show scrollbars
+* Bug Fix: Likes: Remove setInterval( JetpackLikesWidgetQueueHandler, 250 )
+call that was causing heavy CPU load
+* Bug Fix: Mobile Theme: Remove unused variable & function call
+* Bug Fix: Publicize: Fix LinkedIn profile URL generation
+* Bug Fix: Publicize: Better refresh handling for services such as LinkedIn
+and Facebook
+* Bug Fix: Shortcodes: Audio shortcode: Treat src as element 0. Fixes audio
+shortcodes created by wp_embed_register_handler when an audio url is on a line
+by itself
+* Bug Fix: Bandcamp: Updates to the Bandcamp shortcode
+* Bug Fix: Stats: Fix missing function get_editable_roles on non-admin page
+loads
+* Bug Fix: Widgets: Twitter Timeline: Fix HTML links in admin; set default
+values for width/height; change some of the sanitization functions
+* Bug Fix: Widgets: Top Posts Widget: Exclude attachments
+* Bug Fix: Widgets: Top Posts Widget: fix data validation for number of posts
+* Bug Fix: Fix PHP warnings non-static method called dynamically
+* Bug Fix: Fixed an issue in image extraction from HTML content
+* Bug Fix: Open Graph: Change default minimum size for og:image too 200×200
+* Note: The old Twitter widget was removed in favour of Twitter Timeline
+widget
+* Note: Add is_module_active() to make it easier to detect what is and what
+isn’t
+* Note: Compressing images via lossless methods
+* Note: Tidying up jetpack’s CSS
+* Note: Set the max DB version for our retina overrides that were meant to
+stop for WordPress 3.5
+* Note: Updating spin.js to the current version, and shifting to the canonical
+jquery.spin.js library
+* Note: Adding Jetpack_Options class, and abstracting out options functions to
+it
+
+= 2.2.5 =
+Release Date: May 1, 2013
+Release Post: http://wp.me/p1moTy-p8
+
+* Enhancement: Stats: Counting of registered users' views can now be enabled
+for specific roles
+* Bug Fix: Security tightening for metadata support in the REST API
+* Bug Fix: Update the method for checking Twitter Timeline widget_id and
+update coding standards
+* Bug Fix: Custom CSS: Allow the content width setting to be larger than the
+theme's content width
+* Bug Fix: Custom CSS: Fix possible missing argument warning.
+
+= 2.2.4 =
+Release Date: April 26, 2013
+Release Post: http://wp.me/p1moTy-oU
+
+* Bug Fix: JSON API compat file include was not assigning a variable
+correctly, thus throwing errors. This has been resolved.
+
+= 2.2.3 =
+Release Date: April 26, 2013
+Release Post: http://wp.me/p1moTy-oR
+
+* Enhancement: Comments - Add the reply-title H3 to the comment form so that
+themes or user CSS can style it
+* Enhancement: Custom CSS - Support for the CSS @viewport
+* Enhancement: JSON API - Support for i_like, is_following, and is_reblogged
+* Enhancement: JSON API: Custom Post Type Support
+* Enhancement: JSON API: Meta Data Support
+* Enhancement: JSON API: Bundled Support for bbPress
+* Enhancement: JSON API: Additions of following, reblog, and like status for
+post endpoints.
+* Enhancement: Shortcodes - Add Bandcamp shortcode
+* Enhancement: Tiled Galleries - Add code to get blog_id
+* Bug Fix: Carousel - Support relative image paths incase a plugin is
+filtering attachment URLs to be relative instead of absolute
+* Bug Fix: Carousel - Add likes widget to images / Respect comment settings
+for name/email
+* Bug Fix: Carousel - Make name and email optional if the setting in the admin
+area says they are
+* Bug Fix: Contact Form - Bug fixes, including a fix for WP-CLI
+* Bug Fix: Contact Form - Remove deprecated .live calls, delegate lazily to
+jQuery(document) since it's all in an iframe modal
+* Bug Fix: Contact Form - RTL styles
+* Bug Fix: Contact Form - Better handle MP6 icons
+* Bug Fix: Custom CSS - array_shift() took a variable by reference, so avoid
+passing it the result of a function
+* Bug Fix: Custom CSS - Allow case-insensitive CSS properties (ref)
+* Bug Fix: Infinite Scroll - Maintain main query's `post__not_in` values when
+querying posts for IS
+* Bug Fix: Infinite Scroll - Ensure that IS's `pre_get_posts` method isn't
+applied in the admin. Also fixes an incorrect use of `add_filter()` where
+`add_action()` was meant. Fixes #1696-plugins
+* Bug Fix: Infinite Scroll - CSS update - IS footer was too large in Firefox
+* Bug Fix: Infinite Scroll - Add bundled support for Twenty Thirteen default
+theme
+* Bug Fix: Infinite Scroll - Include posts table's prefix when modifying the
+SQL WordPress generates to retrieve posts for Infinite Scroll
+* Bug Fix: JSON API - Use wp_set_comment_status to change the comment status,
+to make sure actions are run where needed
+* Bug Fix: Likes - Update style and logic for matching id's
+* Bug Fix: Mobile Theme - Ensure that
+minileven_actual_current_theme() is child-theme compatible +
+other updates
+* Bug Fix: Mobile Theme - Update method for finding currently active theme.
+* Bug Fix: Notifications - Remove the postmessage.js enqueue since this
+feature solely supports native postMessage
+* Bug Fix: Notifications - Clean up script enqueues and use core versions of
+underscore and backbone on wpcom as fallbacks
+* Bug Fix: Notifications - Enqueue v2 scripts and style
+* Bug Fix: Notifications - Prefix module-specific scripts and style to prevent
+collision
+* Bug Fix: Notifications - Include lang and dir attributes on
+#wpnt-notes-panel so the notifications iframe can use these to display
+correctly
+* Bug Fix: Open Graph: Use the profile OG type instead of author. Add tags for
+first/last names
+* Bug Fix: Publicize - Remove the Yahoo! service because they stopped
+supporting that API entirely
+* Bug Fix: Publicize - fix fatal errors caused by using a method on a
+non-object. Props @ipstenu
+* Bug Fix: Sharing - Adding 2x graphics for Pocket sharing service
+* Bug Fix: Sharing - Bug fixes, and a new filter
+* Bug Fix: Shortcodes - Audio: make sure that the Jetpack audion shortcode
+does not override the 3.6 core audio shortcode. Also, we need to filter the
+old Jetpack-style shortcode to properly set the params for the Core audio
+shortcode.
+* Bug Fix: Shortcodes - Audio: Re-enable the flash player
+* Bug Fix: Shortcodes - Slideshow: RTL styling update
+* Bug Fix: Tiled Galleries - Fix IE8 display bug where it doesn't honor inline
+CSS for width on images
+* Bug Fix: Tiled Galleries - Remove depreacted hover call, use mouseenter
+mouseleave instead
+* Enhancement: Twitter Timeline Widget: New JavaScript based widget. Old one
+will discontinue May 7th.
+
+= 2.2.2 =
+Release Date: April 5, 2013
+
+* Enhancement: Mobile Theme: Add controls for custom CSS.
+* Enhancement: Sharing: Add Pocket to the available services.
+* Bug Fix: Custom CSS: Update the method for generating content width setting.
+* Bug Fix: JSON API: Security updates.
+* Bug Fix: Likes: Add settings for email notifications and misc style updates.
+* Bug Fix: Notifications: Add the post types to sync after init.
+* Bug Fix: Publicize: RTL styling.
+* Bug Fix: Shortcodes: security fixes and function prefixing.
+* Bug Fix: Widgets: Update wording on the Top Posts widget for clarity.
+* Bug Fix: Jetpack Post Images security fixes.
+
+= 2.2.1 =
+Release Date: March 28, 2013
+Release Post: http://wp.me/p1moTy-ob
+
+* Enhancement: Development Mode: Define the `JETPACK_DEV_DEBUG` constant to
+`true` to enable an offline mode for localhost development. Only modules that
+don't require a WordPress.com connection can be enabled in this mode.
+* Enhancement: Likes: Added the number of likes to the wp-admin/edit.php
+screens.
+* Enhancement: Mobile Theme - design refresh
+* Enhancement: Shortcodes - Add a filter to the shortcode loading section so
+that a plugin can override what Jetpack loads for shortcodes
+* Enhancement: Widgets - Filter Jetpack's widgets so that a plugin can control
+which widgets get loaded
+* Bug Fix: Comments - Add in a wrapper div with id='commentform'
+* Bug Fix: Contact Form - Added date field with datepicker
+* Bug Fix: Contact Form - Allowed non-text widgets to use contact forms by
+running their output through the widget_text filter
+* Bug Fix: Custom CSS - Allowing color values to be defined multiple times
+* Bug Fix: Custom CSS - Dynamically loading the correct CSS/LESS/SCSS mode for
+the CSS editor if the user changes the preprocessor
+* Bug Fix: Custom CSS - Using the unminified worker CSS
+* Bug Fix: Custom CSS - Added rule: reminder about using .custom-background on
+body selector
+* Bug Fix: Custom CSS - Modified rule: Removed portion of overqualification
+rule that deems 'a.foo' overqualified if there are no other 'a' rules
+* Bug Fix: Custom CSS - Ensuring that the editor and the textarea behind it
+are using the same font so that the cursor appears in the correct location
+* Bug Fix: Custom CSS - Fix a bug that caused some sites to always ignore the
+base theme's CSS when in preview mode
+* Bug Fix: Custom CSS - Run stripslashes() before passing CSS to save()
+* Bug Fix: Custom CSS - Moving inline CSS and JavaScript into external files
+* Bug Fix: Infinite Scroll - Use the `is_main_query()` function and query
+method
+* Bug Fix: Infinite Scroll - Remove unused styles and an unnecessary margin
+setting
+* Bug Fix: Infinite Scroll - Allow the query used with IS to be filtered, so
+IS can be applied to a new query within a page template
+* Bug Fix: JSON API - Catch the 'User cannot view password protected post'
+error from can_view_post and bypass it for likes actions if the user has the
+password entered
+* Bug Fix: Likes - Bump cache buster, Don't show likes for password protected
+posts
+* Bug Fix: Notifications - Remove a redundant span closing tag
+* Bug Fix: Photon - If an image is already served from Photon but the anchor
+tag that surrounds it hasn't had its `href` value rewritten to use Photon, do
+so. Accounts for WP galleries whose individual items are linked to the
+original image files
+* Bug Fix: Publicize - Allows GLOBAL_CAP to be filtered, Adds an AYS to
+connection deletion, UI improvement for MP6 (and in general)
+* Bug Fix: Sharedaddy - Fire the sharing redirect earlier for increased plugin
+compatibility
+* Bug Fix: Stats - Move the display:none CSS output to wp_head so it gets
+written inside the HEAD tag if the option to hide the stats smilie is active
+* Bug Fix: Tiled Galleries - A more descriptive name for the default gallery
+type
+* Bug Fix: Tiled Galleries - Hide the Columns setting for gallery types that
+don't support it
+* Bug Fix: Run the admin_menu action late so that plugins hooking into it get
+a chance to run
+* Bug Fix: Prophylactic strict equality check
+
+= 2.2 =
+Release Date: February 26, 2013
+Release Post: http://wp.me/p1moTy-ns
+
+* Enhancement: Likes: Allow your readers to show their appreciation of your
+posts.
+* Enhancement: Shortcodes: SoundCloud: Update to version 2.3 of the SoundCloud
+plugin (HTML5 default player, various fixes).
+* Enhancement: Shortcodes: Subscriptions: Add a shortcode to enable placement
+of a subscription signup form in a post or page.
+* Enhancement: Sharedaddy: Allow selecting multiple images from a post using
+the Pinterest share button.
+* Enhancement: Contact Form: Allow feedbacks to be marked spam in bulk.
+* Enhancement: Widgets: Readmill Widget: Give your visitors a link to send
+your book to their Readmill library.
+* Note: Notifications: Discontinue support for Internet Explorer 7 and below.
+* Bug Fix: JSON API: Fix authorization problems that some users were
+experiencing.
+* Bug Fix: JSON API: Sticky posts were not being sorted correctly in /posts
+requests.
+* Bug Fix: Stats: sync stats_options so server has roles array needed for
+view_stats cap check.
+* Bug Fix: Infinite Scroll: Display improvements.
+* Bug Fix: Infinite Scroll: WordPress compatibility fixes.
+* Bug Fix: Photon: Only rewrite iamge urls if the URL is compatible with
+Photon.
+* Bug Fix: Photon: Account for registered image sizes with one or more
+dimesions set to zero.
+* Bug Fix: Subscriptions: Make HTML markup more valid.
+* Bug Fix: Subscriptions: Fixed notices displayed in debug mode.
+* Bug Fix: Custom CSS: CSS warnings and errors should now work in environments
+where JavaScript is concatenated or otherwise modified before being served.
+* Bug Fix: Hovercards: WordPress compatibility fixes.
+* Bug Fix: Improved image handling for the Sharing and Publicize modules.
+* Bug Fix: Carousel: Display and Scrollbar fixes.
+* Bug Fix: Tiled Galleries: Restrict images in tiled galleries from being set
+larger than their containers.
+* Bug Fix: Widgets: Gravatar Profile: CSS fixes.
+* Bug Fix: Publicize: Strip HTML comments from the data we send to the third
+party services.
+* Bug Fix: Notifications: Dropped support for IE7 and below in the
+notifications menu.
+* Bug Fix: Custom CSS Editor: Allow custom themes to save CSS more easily.
+* Bug Fix: Infinite Scroll: Waits until the DOM is ready before loading the
+scrolling code.
+* Bug Fix: Mobile Theme: If the user has disabled the custom header text
+color, show the default black header text color.
+* Bug Fix: Mobile Theme: Fix for the "View Full Site" link.
+* Bug Fix: Mobile Theme: Use a filter to modify the output of wp_title().
+* Bug Fix: Publicize: Twitter: Re-enable character count turning red when more
+than 140 characters are typed.
+
+= 2.1.2 =
+Release Date: February 5, 2013
+
+* Enhancement: Infinite Scroll: Introduce filters for Infinite Scroll.
+* Enhancement: Shortcodes: TED shortcode.
+* Bug Fix: Carousel: Make sure to use large image sizes.
+* Bug Fix: Carousel: Clicking the back button in your browser after exiting a
+carousel gallery brings you back to the gallery.
+* Bug Fix: Carousel: Fix a scrollbar issue.
+* Bug Fix: Comments: Move the get_avatar() function out of the base class.
+* Bug Fix: Contact Form: Prevent the form from displaying i18n characters.
+* Bug Fix: Contact Form: Remove the !important CSS rule.
+* Bug Fix: Infinite Scroll: Main query arguments are not respected when using
+default permalink.
+* Bug Fix: JSON API: Trap 'wp_die' for new comments and image uploads.
+* Bug Fix: JSON API: Use a better array key for the user_ID.
+* Bug Fix: JSON API: Make the class instantiable only once, but multi-use.
+* Bug Fix: JSON API: Fix lookup of pages by page slug.
+* Bug Fix: JSON API: Updates for post likes.
+* Bug Fix: Mobile Theme: Remove Android download link for BB10 and Playbook.
+* Bug Fix: Open Graph: Stop using Loop functions to get post data for meta
+tags.
+* Bug Fix: Photon: Suppress and check for warnings when pasing_url and using
+it.
+* Bug Fix: Photon: Ensure full image size can be used.
+* Bug Fix: Photon: Resolve Photon / YouTube embed conflict.
+* Bug Fix: Photon: Fix dimension parsing from URLs.
+* Bug Fix: Photon: Make sure that width/height atts are greater than zero.
+* Bug Fix: Sharedaddy: Layout fixes for share buttons.
+* Bug Fix: Sharedaddy: Always send Facebook a language locale.
+* Bug Fix: Sharedaddy: Don't look up share counts for empty URLs.
+* Bug Fix: Shortcodes: Ensure that images don't overflow their containers in
+the slideshow shortcode.
+* Bug Fix: Shortcodes: only enqueue jquery if archive supports Infinite Scroll
+in the Audio Shortcode.
+* Bug Fix: Tiled Galleries: Use a more specific class for gallery item size to
+avoid conflicts.
+* Bug Fix: Tiled Galleries: Fixing scrolling issue when tapping on a Tiled
+Gallery on Android.
+* Bug Fix: Widgets: Gravatar profile widget typo.
+* Bug Fix: Widgets: Add (Jetpack) to widget titles.
+* Bug Fix: Widgets: Twitter wasn't wrapping links in the t.co shortener.
+* Bug Fix: Widgets: Facebook Likebox updates to handling the language locale.
+* Bug Fix: Widgets: Top Posts: Fixed a WP_DEBUG notice.
+* Bug Fix: Widgets: Gravatar Profile Widget: transient names must be less than
+45 characters long.
+* Bug Fix: typo in delete_post_action function.
+* Bug Fix: Load rendered LaTeX image on same protocol as its page.
+
+
+= 2.1.1 =
+Release Date: January 5, 2013
+Release Post: http://wp.me/p1moTy-ng
+
+* Bug Fix: Fix for an error appearing for blogs updating from Jetpack 1.9.2 or
+earlier to 2.1.
+
+= 2.1 =
+Release Date: January 4, 2013
+Release Post: http://wp.me/p1moTy-m3
+
+* Enhancement: Tiled Galleries: Show off your photos with cool mosaic
+galleries.
+* Enhancement: Slideshow gallery type: Display any gallery as a slideshow.
+* Enhancement: Custom CSS: Allow zoom property.
+* Enhancement: Stats: Show WordPress.com subscribers in stats.
+* Bug Fix: Fix errors shown after connecting Jetpack to WordPress.com.
+* Bug Fix: Photon: Fix bug causing errors to be shown in some posts.
+* Bug Fix: Photon: Convert all images in posts when Photon is active.
+* Bug Fix: Infinite Scroll: Improved compatibility with the other modules.
+* Bug Fix: Custom CSS: Updated editor to fix missing file errors.
+* Bug Fix: Publicize: Don't show the Facebook profile option if this is a
+Page-only account.
+* Bug Fix: Photon: A fix for photos appearing shrunken if they didn't load
+quickly enough.
+* Bug Fix: Sharing: A compatibility fix for posts that only have partial
+featured image data.
+* Bug Fix: Publicize/Sharing: For sites without a static homepage, don't set
+the OpenGraph url value to the first post permalink.
+* Bug Fix: Mobile Theme: Better compatibility with the customizer on mobile
+devices.
+* Bug Fix: Sharing: Don't show sharing options on front page if that option is
+turned off.
+* Bug Fix: Contact Form: Fix PHP warning shown when adding a Contact Form in
+WordPress 3.5.
+* Bug Fix: Photon: Handle images with relative paths.
+* Bug Fix: Contact Form: Fix compatibility with the Shortcode Embeds module.
+
+
+= 2.0.4 =
+Release Date: December 14, 2012
+Release Post: http://wp.me/p1moTy-lT
+
+* Bug Fix: Open Graph: Correct a bug that prevents Jetpack from being
+activated if the SharePress plugin isn't installed.
+
+= 2.0.3 =
+Release Date: December 14, 2012
+Release Post: http://wp.me/p1moTy-lJ
+
+* Enhancement: Infinite Scroll: support
+[VideoPress](https://wordpress.org/plugins/video/) plugin.
+* Enhancement: Photon: Apply to all images retrieved from the Media Library.
+* Enhancement: Photon: Retina image support.
+* Enhancement: Custom CSS: Refined editor interface.
+* Enhancement: Custom CSS: Support [Sass](http://sass-lang.com/) and
+[LESS](http://lesscss.org/) with built-in preprocessors.
+* Enhancement: Open Graph: Better checks for other plugins that may be loading
+Open Graph tags to prevent Jetpack from doubling meta tag output.
+* Bug Fix: Infinite Scroll: Respect relative image dimensions.
+* Bug Fix: Photon: Detect custom-cropped images and use those with Photon,
+rather than trying to use the original.
+* Bug Fix: Custom CSS: Fix for bug preventing @import from working with
+url()-style URLs.
+
+= 2.0.2 =
+Release Date: November 21, 2012
+Release Post: http://wp.me/p1moTy-lu
+
+* Bug Fix: Remove an erroneous PHP short open tag with the full tag to correct
+fatal errors under certain PHP configurations.
+
+= 2.0.1 =
+Release Date: November 21, 2012
+Release Post: http://wp.me/p1moTy-lc
+
+* Enhancement: Photon: Support for the [Lazy
+Load](https://wordpress.org/plugins/lazy-load/) plugin.
+* Bug Fix: Photon: Fix warped images with un- or under-specified dimensions.
+* Bug Fix: Photon: Fix warped images with pre-photonized URLs; don't try to
+photonize them twice.
+* Bug Fix: Infinite Scroll: Check a child theme's parent theme for infinite
+scroll support.
+* Bug Fix: Infinite Scroll: Correct a bug with archives that resulted in posts
+appearing on archives that they didn't belong on.
+* Bug Fix: Publicize: Send the correct shortlink to Twitter (et al.) if your
+site uses a shortener other than wp.me.
+* Bug Fix: Sharing: Improved theme compatibility for the Google+ button.
+* Bug Fix: Notifications: Use locally-installed Javascript libraries if
+available.
+
+= 2.0 =
+Release Date: November 8, 2012
+Release Post: http://wp.me/p1moTy-jg
+
+* Enhancement: Publicize: Connect your site to popular social networks and
+automatically share new posts with your friends.
+* Enhancement: Post By Email: Publish posts to your blog directly from your
+personal email account.
+* Enhancement: Photon: Images served through the global WordPress.com cloud.
+* Enhancement: Infinite Scroll: Better/faster browsing by pulling the next set
+of posts into view automatically when the reader approaches the bottom of the
+page.
+* Enhancement: Open Graph: Provides more detailed information about your posts
+to social networks.
+* Enhancement: JSON API: New parameters for creating and viewing posts.
+* Enhancement: Improved compatibility for the upcoming WordPress 3.5.
+* Bug Fix: Sharing: When you set your sharing buttons to use icon, text, or
+icon + text mode, the Google+ button will display accordingly.
+* Bug Fix: Gravatar Profile Widget: Allow basic HTML to be displayed.
+* Bug Fix: Twitter Widget: Error handling fixes.
+* Bug Fix: Sharing: Improved theme compatibility
+* Bug Fix: JSON API: Fixed error when creating some posts in some versions of
+PHP.
+
+= 1.9.2 =
+Release Date: October 29, 2012
+
+* Bug Fix: Only sync options on upgrade once.
+
+= 1.9.1 =
+Release Date: October 29, 2012
+Release Post: http://wp.me/p1moTy-iC
+
+* Enhancement: Notifications feature is enabled for logged-out users when the
+module is active & the toolbar is shown by another plugin.
+* Bug Fix: Use proper CDN addresses to avoid SSL cert issues.
+* Bug Fix: Prioritize syncing comments over deleting comments on
+WordPress.com. Fixes comment notifications marked as spam appearing to be
+trashed.
+
+= 1.9 =
+Release Date: October 26, 2012
+Release Post: http://wp.me/p1moTy-hC
+
+* Enhancement: Notifications: Display Notifications in the toolbar and support
+reply/moderation of comment notifications.
+* Enhancement: Mobile Push Notifications: Added support for mobile push
+notifications of new comments for users that linked their accounts to
+WordPress.com accounts.
+* Enhancement: JSON API: Allows applications to send API requests via
+WordPress.com (see [the docs](http://developer.wordpress.com/docs/api/) )
+* Enhancement: Sync: Modules (that require the data) sync full Post/Comment to
+ensure consistent data on WP.com (eg Stats)
+* Enhancement: Sync: Improve syncing of site options to WP.com
+* Enhancement: Sync: Sync attachment parents to WP.com
+* Enhancement: Sync: Add signing of WP.com user ids for Jetpack Comments
+* Enhancement: Sync: Mark and obfuscate private posts.
+* Enhancement: Privacy: Default disable enhanced-distribution and json-api
+modules if site appears to be private.
+* Enhancement: Custom CSS: allow applying Custom CSS to mobile theme.
+* Enhancement: Sharing: On HTTPS pageloads, load as much of the sharing embeds
+as possible from HTTPS URLs.
+* Enhancement: Contact Form: Overhaul of the contact form code to fix
+incompatibilites with other plugins.
+* Bug Fix: Only allow users with manage_options permission to enable/disable
+modules
+* Bug Fix: Custom CSS: allow '/' in media query units; e.g.
+(-o-min-device-pixel-ratio: 3/2)
+* Bug Fix: Custom CSS: leave comments alone in CSS when editing but minify on
+the front end
+* Bug Fix: Sharing: Keep "more" pane open so Google+ Button isn't obscured
+* Bug Fix: Carousel: Make sure the original size is used, even when it is
+exceedingly large.
+* Bug Fix: Exclude iPad from Twitter on iPhone mobile browsing
+* Bug Fix: Sync: On .org user role changes synchronize the change to .com
+* Bug Fix: Contact Form: Fix a bug where some web hosts would reject mail from
+the contact form due to email address spoofing.
+
+= 1.8.3 =
+Release Date: October 23, 2012
+
+* Bug Fix: Subscriptions: Fix a bug where subscriptions were not being sent
+from the blog.
+* Bug Fix: Twitter: Fix a bug where the Twitter username was being saved as
+blank.
+* Bug Fix: Fix a bug where Contact Form notification emails were not being
+sent.
+
+= 1.8.2 =
+Release Date: October 4, 2012
+Release Post: http://wp.me/p1moTy-gI
+
+* Bug Fix: Subscriptions: Fix a bug where subscriptions were not sent for
+posts and comments written by some authors.
+* Bug Fix: Widgets: Fix CSS that was uglifying some themes (like P2).
+* Bug Fix: Widgets: Improve Top Posts and Pages styling.
+* Bug Fix: Custom CSS: Make the default "Welcome" message translatable.
+* Bug Fix: Fix Lithuanian translation.
+
+= 1.8.1 =
+Release Date: September 28, 2012
+Release Post: http://wp.me/p1moTy-gx
+
+* Bug Fix: Stats: Fixed a bug preventing some users from viewing stats.
+* Bug Fix: Mobile Theme: Fixed some disabled toolbar buttons.
+* Bug Fix: Top Posts widget: Fixed a bug preventing the usage of the Top Posts
+widget.
+* Bug Fix: Mobile Theme: Fixed a bug that broke some sites when the
+Subscriptions module was not enabled and the Mobile Theme module was enabled.
+* Bug Fix: Mobile Theme: Made mobile app promos in the Mobile Theme footer
+opt-in.
+* Bug Fix: Twitter Widget: A fix to prevent malware warnings.
+* Bug Fix: Mobile Theme: Fixed a bug that caused errors for some users with
+custom header images.
+
+= 1.8 =
+Release Date: September 27, 2012
+Release Post: http://wp.me/p1moTy-fV
+
+* Enhancement: Mobile Theme: Automatically serve a slimmed down version of
+your site to users on mobile devices.
+* Enhancement: Multiuser: Allow multiple users to link their accounts to
+WordPress.com accounts.
+* Enhancement: Custom CSS: Added support for object-fit, object-position,
+transition, and filter properties.
+* Enhancement: Twitter Widget: Added Follow button
+* Enhancement: Widgets: Added Top Posts and Pages widget
+* Enhancement: Mobile Push Notifications: Added support for mobile push
+notifications on new comments.
+* Enhancement: VideoPress: Shortcodes now support the HD option, for default
+HD playback.
+* Bug Fix: Twitter Widget: Fixed tweet permalinks in the Twitter widget
+* Bug Fix: Custom CSS: @import rules and external images are no longer
+stripped out of custom CSS
+* Bug Fix: Custom CSS: Fixed warnings and notices displayed in debug mode
+* Bug Fix: Sharing: Fixed double-encoding of image URLs
+* Bug Fix: Sharing: Fix Google +1 button HTML validation issues (again :))
+* Bug Fix: Gravatar Profile Widget: Reduce size of header margins
+
+= 1.7 =
+Release Date: August 23, 2012
+Release Post: http://wp.me/p1moTy-eq
+
+* Enhancement: CSS Editor: Customize your site's design without modifying your
+theme.
+* Enhancement: Comments: Submit the comment within the iframe. No more full
+page load to jetpack.wordpress.com.
+* Enhancement: Sharing: Share counts for Twitter, Facebook, LinkedIn
+* Enhancement: Sharing: Improve styling
+* Enhancement: Sharing: Add support for ReCaptcha
+* Enhancement: Sharing: Better extensability through filters
+* Enhancement: Widgets: Twitter: Attempt to reduce errors by storing a long
+lasting copy of the data. Thanks, kareldonk :)
+* Regression Fix: Sharing: Properly store and display the sharing label
+option's default value.
+* Bug Fix: Contact Form: remove worse-than-useless nonce.
+* Bug Fix: Subscriptions: remove worse-than-useless nonce.
+* Bug Fix: Sharing: Don't show sharing buttons twice on attachment pages.
+* Bug Fix: Sharing: Increase width of Spanish Like button for Facebook.
+* Bug Fix: Sharing: Use the correct URL to the throbber.
+* Bug Fix: Stats: Fix notice about undefined variable $alt
+* Bug Fix: Subscriptions: Make Subscriptions module obey the settings of the
+Settngs -> Discussion checkboxes for Follow Blog/Comments
+* Bug Fix: Shortcodes: VideoPress: Compatibility with the latest version of
+VideoPress
+* Bug Fix: Shortcodes: Audio: Include JS File for HTML5 audio player
+* Bug Fix: Hovercards: Improve cache handling.
+* Bug Fix: Widgets: Gravatar Profle: Correctly display service icons in edge
+cases.
+* Bug Fix: Widgets: Gravatar Profle: Prevent ugly "flash" of too-large image
+when page first loads on some sites
+* Bug Fix: Carousel: CSS Compatibility with more themes.
+
+= 1.6.1 =
+Release Date: August 4, 2012
+
+* Bug Fix: Prevent Fatal error under certain conditions in sharing module
+* Bug Fix: Add cachebuster to sharing.css
+* Bug Fix: Disable via for Twitter until more robust code is in place
+
+= 1.6 =
+Release Date: August 2, 2012
+Release Post: http://wp.me/p1moTy-e0
+
+* Enhancement: Carousel: Better image resolution selection based on available
+width/height.
+* Enhancement: Carousel: Load image caption, metadata, comments, et alii when
+a slide is clicked to switch to instead of waiting.
+* Enhancement: Carousel: Added a "Comment" button and handling to scroll to
+and focus on comment textarea.
+* Enhancement: Widgets: Facebook Likebox now supports a height parameter and a
+better width parameter.
+* Enhancement: Widgets: Better feedback when widgets are not set up properly.
+* Enhancement: Shortcodes: Google Maps shortcode now supports percentages in
+the width.
+* Enhancement: Shortcodes: Update Polldaddy shortcode for more efficient
+Javascript libraries.
+* Enhancement: Shortcodes: Youtube shortcode now has playlist support.
+* Enhancement: Add Gravatar Profile widget.
+* Enhancement: Update Sharedaddy to latest version, including Pinterest
+support.
+* Enhancement: Retinize Jetpack and much of WordPress.
+* Bug Fix: Shortcodes: Fix Audio shortcode color parameter and rename encoding
+function.
+* Bug Fix: Shortcodes: Don't output HTML 5 version of the Audio shortcode
+because of a bug with Google Reader.
+* Bug Fix: Jetpack Comments: Don't overlead the addComments object if it
+doesn't exist. Fixes spacing issue with comment form.
+* Bug Fix: Contact Form: If send_to_editor() exists, use it. Fixes an IE9 text
+area issue.
+
+= 1.5 =
+Release Date: July 31, 2012
+Release Post: http://wp.me/p1moTy-d7
+
+* Enhancement: Add Gallery Carousel feature
+* Note: the Carousel module bundles http://fgnass.github.com/spin.js/ (MIT
+license)
+
+= 1.4.2 =
+Release Date: June 20, 2012
+
+* Bug Fix: Jetpack Comments: Add alternative Javascript event listener for
+Internet 8 users.
+* Enhancement: Remove more PHP 4 backwards-compatible code (WordPress
+andJetpack only support PHP 5).
+* Enhancement: Remove more WordPress 3.1 and under backwards-compatible code.
+
+= 1.4.1 =
+Release Date: June 15, 2012
+
+* Bug Fix: Jetpack Comments / Subscriptions: Add checkboxes and logic control
+for the Subscription checkboxes.
+
+= 1.4 =
+Release Date: June 14, 2012
+Release Post: http://wp.me/p1moTy-cz
+
+* Enhancement: Add Jetpack Comments feature.
+* Bug Fix: Sharing: Make the sharing_label translatable.
+* Bug Fix: Sharing: Fixed the file type on the LinkedIn graphic.
+* Bug Fix: Sharing: Fixes for the Faceboox Like button language locales.
+* Bug Fix: Sharing: Updates for the "more" button when used with touch screen
+devices.
+* Bug Fix: Sharing: Properly scope the More button so that multiple More
+buttons on a page behave properly.
+* Bug Fix: Shortcodes: Update the YouTube and Audio shortcodes to better
+handle spaces in the URLs.
+* Bug Fix: Shortcodes: Make the YouTube shortcode respect embed settings in
+Settings -> Media when appropriate.
+* Bug Fix: Shortcodes: Removed the Slide.com shortcode; Slide.com no longer
+exists.
+* Bug Fix: Shortcodes: Match both http and https links in the [googlemaps]
+shortcode.
+* Bug Fix: After the Deadline: Code clean up and removal of inconsistencies.
+
+= 1.3.4 =
+Release Date: May 24, 2012
+
+* Bug Fix: Revert changes to the top level menu that are causing problems.
+
+= 1.3.3 =
+Release Date: May 22, 2012
+
+* Bug Fix: Fix notices caused by last update
+
+= 1.3.2 =
+Release Date: May 22, 2012
+
+* Bug Fix: Fix Jetpack menu so that Akismet and VaultPress submenus show up.
+
+= 1.3.1 =
+Release Date: May 22, 2012
+
+* Enhancement: Add a new widget, the Facebook Likebox
+* Bug Fix: Sharing: Sharing buttons can now be used on custom post types.
+* Bug Fix: Contact Forms: Make Contact Forms widget shortcode less aggressive
+about the shortcodes it converts.
+* Bug Fix: Ensure contact forms are parsed correctly in text widgets.
+* Bug Fix: Connection notices now only appear on the Dashboard and plugin
+page.
+* Bug Fix: Connection notices are now dismissable if Jetpack is not network
+activated.
+* Bug Fix: Subscriptions: Fix an issue that was causing errors with new
+BuddyPress forum posts.
+
+= 1.3 =
+Release Date: April 25, 2012
+Release Post: http://wp.me/p1moTy-bq
+
+* Enhancement: Add Contact Forms feature. Formerly Grunion Contact Forms.
+* Bug Fix: Tweak YouTube autoembedder to catch more YouTube URLs.
+* Bug Fix: Correctly load the Sharing CSS files.
+
+= 1.2.4 =
+Release Date: April 6, 2012
+
+* Bug Fix: Fix rare bug with static front pages
+
+= 1.2.3 =
+Release Date: April 5, 2012
+Release Post: http://wp.me/p1moTy-b4
+
+* Enhancement: Twitter Widget: Expand t.co URLs
+* Bug Fix: Various PHP Notices.
+* Bug Fix: WordPress Deprecated `add_contextual_help()` notices
+* Bug Fix: Don't display unimportant DB errors when processing Jetpack nonces
+* Bug Fix: Correctly sync data during certain MultiSite cases.
+* Bug Fix: Stats: Allow sparkline img to load even when there is a DB upgrade.
+* Bug Fix: Stats: Replace "loading title" with post title regardless of type
+and status.
+* Bug Fix: Stats: Avoid edge case infinite redirect for `show_on_front=page`
+sites where the `home_url()` conatins uppercase letters.
+* Bug Fix: Subscriptions: Don't send subscriptions if the feature is turned
+off in Jetpack.
+* Bug Fix: Subscriptions: Fix pagination of subscribers.
+* Bug Fix: Subscriptions: Sync data about categories/tags as well to improve
+subscription emails.
+* Bug Fix: Subscriptions: Better styling for the subscription success message.
+* Bug Fix: Shortcodes: Support for multiple Google Maps in one post. Support
+for all Google Maps URLs.
+* Bug Fix: Shortcodes: Improved support for youtu.be URLs
+* Bug Fix: Shortcodes: Improved Vimeo embeds.
+* Bug Fix: Sharing: Switch to the 20px version of Google's +1 button for
+consistency.
+* Bug Fix: Sharing: Fix Google +1 button HTML validation issues.
+* Bug Fix: Sharing: Disable sharing buttons during preview.
+* Bug Fix: Spelling and Grammar: Properly handle proofreading settings.
+* Bug Fix: Spelling and Grammar: Don't prevent post save when proofreading
+service is unavailable.
+
+= 1.2.2 =
+Release Date: December 6, 2011
+Release Post: http://wp.me/p1moTy-ax
+
+* Bug Fix: Ensure expected modules get reactivated correctly during upgrade.
+* Bug Fix: Don't send subscription request during spam comment submission.
+* Bug Fix: Increased theme compatibility for subscriptions.
+* Bug Fix: Remove reference to unused background image.
+
+= 1.2.1 =
+Release Date: November 18, 2011
+Release Post: http://wp.me/p1moTy-9H
+
+* Bug Fix: Ensure Site Stats menu item is accessible.
+* Bug Fix: Fixed errors displayed during some upgrades.
+* Bug Fix: Fix inaccurate new modules "bubble" in menu for some upgrades.
+* Bug Fix: Fix VaultPress detection.
+* Bug Fix: Fix link to http://jetpack.com/faq/
+
+= 1.2 =
+Release Date: November 17, 2011
+Release Post: http://wp.me/p1moTy-8x
+
+* Enhancement: Add Subscriptions: Subscribe to site's posts and posts'
+comments.
+* Enhancement: Add Google Maps shortcode.
+* Enhancement: Add Image Widget.
+* Enhancement: Add RSS Links Widget.
+* Enhancement: Stats: More responsive stats dashboard.
+* Enhancement: Shortcodes: Google Maps, VideoPress
+* Enhancement: Sharing: Google+, LinkedIn
+* Enhancement: Enhanced Distribution: Added Jetpack blogs to
+https://en.wordpress.com/firehose/
+* Bug Fix: Spelling and Grammar: WordPress 3.3 compatibility.
+* Bug Fix: Translatable module names/descriptinos.
+* Bug Fix: Correctly detect host's ability to make outgoing HTTPS requests.
+
+= 1.1.3 =
+Release Date: July 19, 2011
+Release Post: http://wp.me/p1moTy-90
+
+* Bug Fix: Increase compatibility with WordPress 3.2's new
+`wp_remote_request()` API.
+* Bug Fix: Increase compatibility with Admin Bar.
+* Bug Fix: Stats: Improved performance when creating new posts.
+* Bug Fix: Twitter Widget: Fix PHP Notice.
+* Bug Fix: Sharedaddy: Fix PHP Warning.
+* Enhancement: AtD: Add spellcheck button to Distraction Free Writing screen.
+* Translations: Added: Bosnian, Danish, German, Finnish, Galician, Croatian,
+Indonesian, Macedonian, Norwegian (Bokmål), Russian, Slovak, Serbian, Swedish
+* Translations: Updated: Spanish, French, Italian, Japanese, Brazilian
+Portuguese, Portuguese
+
+= 1.1.2 =
+Release Date: July 6, 2011
+Release Post: http://wp.me/p1moTy-8B
+
+* Bug Fix: Note, store, and keep fresh the time difference between the Jetpack
+site's host and the Jetpack servers at WordPress.com. Should fix all
+"timestamp is too old" errors.
+* Bug Fix: Improve experience on hosts capable of making outgoing HTTPS
+requests but incapable of verifying SSL certificates. Fixes some
+"register_http_request_failed", "error setting certificate verify locations",
+and "error:14090086:lib(20):func(144):reason(134)" errors.
+* Bug Fix: Better fallback when WordPress.com is experiencing problems.
+* Bug Fix: It's Jetpack, not JetPack :)
+* Bug Fix: Remove PHP Warnings/Notices.
+* Bug Fix: AtD: JS based XSS bug. Props markjaquith.
+* Bug Fix: AtD: Prevent stored configuration options from becoming corrupted.
+* Bug Fix: Stats: Prevent missing old stats for some blogs.
+* Bug Fix: Twitter Widget: Fix formatting of dates/times in PHP4.
+* Bug Fix: Twitter Widget: Cache the response from Twitter to prevent "Twitter
+did not respond. Please wait a few minutes and refresh this page." errors.
+* Enhancement: Slightly improved RTL experience. Jetpack 1.2 should include a
+much better fix.
+* Enhancement: Sharedaddy: Improve localization for Facebook Like button.
+* Enhancement: Gravatar Hovercards: Improved experience for Windows browsers.
+
+= 1.1.1 =
+Release Date: March 19, 2011
+Release Post: http://wp.me/p1moTy-8i
+
+* Bug Fix: Improve experience on hosts capable of making outgoing HTTPS
+requests but incapable of verifying SSL certificates. Fixes most "Your Jetpack
+has a glitch. Connecting this site with WordPress.com is not possible. This
+usually means your site is not publicly accessible (localhost)." errors.
+* Bug Fix: Sharedaddy: Fatal error under PHP4. Disable on PHP4 hosts.
+* Bug Fix: Stats: Fatal error under PHP4. Rewrite to be PHP4 compatible.
+* Bug Fix: Stats: Fatal error on some sites modifying/removing core WordPress
+user roles. Add sanity check.
+* Bug Fix: Stats: Replace debug output with error message in dashboard widget.
+* Bug Fix: Stats: Rework hook priorities so that stats views are always
+counted even if a plugin (such as Paginated Comments) bails early on
+template_redirect.
+* Bug Fix: Identify the module that connot be activated to fatal error during
+single module activation.
+* Bug Fix: `glob()` is not always available. Use `opendir()`, `readdir()`,
+`closedir()`.
+* Bug Fix: Send permalink options to Stats Server for improved per post
+permalink calculation.
+* Bug Fix: Do not hide Screen Options and Help links during Jetpack call to
+connect.
+* Bug Fix: Improve readablitiy of text.
+* Bug Fix: AtD: Correctly store/display options.
+* Enhancement: Output more informative error messages.
+* Enhancement: Improve CSS styling.
+* Enhancement: Stats: Query all post types and statuses when getting posts for
+stats reports.
+* Enhancement: Improve performance of LaTeX URLs be using cookieless CDN.
+
+= 1.1 =
+Release Date: March 9, 2011
+Release post: http://wp.me/p1moTy-7R
+
+* Initial release
diff --git a/wp-content/plugins/jetpack/class.frame-nonce-preview.php b/wp-content/plugins/jetpack/class.frame-nonce-preview.php
new file mode 100644
index 000000000..55de1e1e2
--- /dev/null
+++ b/wp-content/plugins/jetpack/class.frame-nonce-preview.php
@@ -0,0 +1,117 @@
+query( 'jetpack.verifyFrameNonce', sanitize_key( $_GET['frame-nonce'] ) );
+
+ if ( $xml->isError() ) {
+ return false;
+ }
+
+ return (bool) $xml->getResponse();
+ }
+
+ /**
+ * Conditionally add a hook on posts_results if this is the main query, a preview, and singular.
+ *
+ * @since 4.3.0
+ *
+ * @param WP_Query $query
+ *
+ * @return WP_Query
+ */
+ public function maybe_display_post( $query ) {
+ if (
+ $query->is_main_query() &&
+ $query->is_preview() &&
+ $query->is_singular()
+ ) {
+ add_filter( 'posts_results', array( $this, 'set_post_to_publish' ), 10, 2 );
+ }
+
+ return $query;
+ }
+
+ /**
+ * Conditionally set the first post to 'publish' if the frame nonce is valid and there is a post.
+ *
+ * @since 4.3.0
+ *
+ * @param array $posts
+ *
+ * @return array
+ */
+ public function set_post_to_publish( $posts ) {
+ remove_filter( 'posts_results', array( $this, 'set_post_to_publish' ), 10, 2 );
+
+ if ( empty( $posts ) || is_user_logged_in() || ! $this->is_frame_nonce_valid() ) {
+ return $posts;
+ }
+
+ $posts[0]->post_status = 'publish';
+
+ // Disable comments and pings for this post.
+ add_filter( 'comments_open', '__return_false' );
+ add_filter( 'pings_open', '__return_false' );
+
+ return $posts;
+ }
+
+ /**
+ * Handle validation for autosave preview request
+ *
+ * @since 4.7.0
+ */
+ public function handle_autosave_nonce_validation() {
+ if ( ! $this->is_frame_nonce_valid() ) {
+ wp_die( __( 'Sorry, you are not allowed to preview drafts.', 'jetpack' ) );
+ }
+ add_filter( 'the_preview', '_set_preview' );
+ }
+}
+
+Jetpack_Frame_Nonce_Preview::get_instance();
diff --git a/wp-content/plugins/jetpack/class.jetpack-admin.php b/wp-content/plugins/jetpack/class.jetpack-admin.php
new file mode 100644
index 000000000..5d1c0409e
--- /dev/null
+++ b/wp-content/plugins/jetpack/class.jetpack-admin.php
@@ -0,0 +1,285 @@
+jetpack = Jetpack::init();
+
+ jetpack_require_lib( 'admin-pages/class.jetpack-react-page' );
+ $this->jetpack_react = new Jetpack_React_Page();
+
+ jetpack_require_lib( 'admin-pages/class.jetpack-settings-page' );
+ $this->fallback_page = new Jetpack_Settings_Page();
+
+ jetpack_require_lib( 'admin-pages/class-jetpack-about-page' );
+ $this->jetpack_about = new Jetpack_About_Page();
+
+ add_action( 'admin_menu', array( $this->jetpack_react, 'add_actions' ), 998 );
+ add_action( 'jetpack_admin_menu', array( $this->jetpack_react, 'jetpack_add_dashboard_sub_nav_item' ) );
+ add_action( 'jetpack_admin_menu', array( $this->jetpack_react, 'jetpack_add_settings_sub_nav_item' ) );
+ add_action( 'jetpack_admin_menu', array( $this, 'admin_menu_debugger' ) );
+ add_action( 'jetpack_admin_menu', array( $this->fallback_page, 'add_actions' ) );
+ add_action( 'jetpack_admin_menu', array( $this->jetpack_about, 'add_actions' ) );
+
+ // Add redirect to current page for activation/deactivation of modules
+ add_action( 'jetpack_pre_activate_module', array( $this, 'fix_redirect' ), 10, 2 );
+ add_action( 'jetpack_pre_deactivate_module', array( $this, 'fix_redirect' ) );
+
+ // Add module bulk actions handler
+ add_action( 'jetpack_unrecognized_action', array( $this, 'handle_unrecognized_action' ) );
+ }
+
+ static function sort_requires_connection_last( $module1, $module2 ) {
+ if ( $module1['requires_connection'] == $module2['requires_connection'] ) {
+ return 0;
+ } elseif ( $module1['requires_connection'] ) {
+ return 1;
+ } elseif ( $module2['requires_connection'] ) {
+ return -1;
+ }
+
+ return 0;
+ }
+
+ // Produce JS understandable objects of modules containing information for
+ // presentation like description, name, configuration url, etc.
+ function get_modules() {
+ include_once JETPACK__PLUGIN_DIR . 'modules/module-info.php';
+ $available_modules = Jetpack::get_available_modules();
+ $active_modules = Jetpack::get_active_modules();
+ $modules = array();
+ $jetpack_active = Jetpack::is_active() || Jetpack::is_development_mode();
+ $overrides = Jetpack_Modules_Overrides::instance();
+ foreach ( $available_modules as $module ) {
+ if ( $module_array = Jetpack::get_module( $module ) ) {
+ /**
+ * Filters each module's short description.
+ *
+ * @since 3.0.0
+ *
+ * @param string $module_array['description'] Module description.
+ * @param string $module Module slug.
+ */
+ $short_desc = apply_filters( 'jetpack_short_module_description', $module_array['description'], $module );
+ // Fix: correct multibyte strings truncate with checking for mbstring extension
+ $short_desc_trunc = ( function_exists( 'mb_strlen' ) )
+ ? ( ( mb_strlen( $short_desc ) > 143 )
+ ? mb_substr( $short_desc, 0, 140 ) . '...'
+ : $short_desc )
+ : ( ( strlen( $short_desc ) > 143 )
+ ? substr( $short_desc, 0, 140 ) . '...'
+ : $short_desc );
+
+ $module_array['module'] = $module;
+ $module_array['activated'] = ( $jetpack_active ? in_array( $module, $active_modules ) : false );
+ $module_array['deactivate_nonce'] = wp_create_nonce( 'jetpack_deactivate-' . $module );
+ $module_array['activate_nonce'] = wp_create_nonce( 'jetpack_activate-' . $module );
+ $module_array['available'] = self::is_module_available( $module_array );
+ $module_array['short_description'] = $short_desc_trunc;
+ $module_array['configure_url'] = Jetpack::module_configuration_url( $module );
+ $module_array['override'] = $overrides->get_module_override( $module );
+
+ ob_start();
+ /**
+ * Allow the display of a "Learn More" button.
+ * The dynamic part of the action, $module, is the module slug.
+ *
+ * @since 3.0.0
+ */
+ do_action( 'jetpack_learn_more_button_' . $module );
+ $module_array['learn_more_button'] = ob_get_clean();
+
+ ob_start();
+ /**
+ * Allow the display of information text when Jetpack is connected to WordPress.com.
+ * The dynamic part of the action, $module, is the module slug.
+ *
+ * @since 3.0.0
+ */
+ do_action( 'jetpack_module_more_info_' . $module );
+
+ /**
+ * Filter the long description of a module.
+ *
+ * @since 3.5.0
+ *
+ * @param string ob_get_clean() The module long description.
+ * @param string $module The module name.
+ */
+ $module_array['long_description'] = apply_filters( 'jetpack_long_module_description', ob_get_clean(), $module );
+
+ ob_start();
+ /**
+ * Filter the search terms for a module
+ *
+ * Search terms are typically added to the module headers, under "Additional Search Queries".
+ *
+ * Use syntax:
+ * function jetpack_$module_search_terms( $terms ) {
+ * $terms = _x( 'term 1, term 2', 'search terms', 'jetpack' );
+ * return $terms;
+ * }
+ * add_filter( 'jetpack_search_terms_$module', 'jetpack_$module_search_terms' );
+ *
+ * @since 3.5.0
+ *
+ * @param string The search terms (comma separated).
+ */
+ echo apply_filters( 'jetpack_search_terms_' . $module, $module_array['additional_search_queries'] );
+ $module_array['search_terms'] = ob_get_clean();
+
+ $module_array['configurable'] = false;
+ if (
+ current_user_can( 'manage_options' ) &&
+ /**
+ * Allow the display of a configuration link in the Jetpack Settings screen.
+ *
+ * @since 3.0.0
+ *
+ * @param string $module Module name.
+ * @param bool false Should the Configure module link be displayed? Default to false.
+ */
+ apply_filters( 'jetpack_module_configurable_' . $module, false )
+ ) {
+ $module_array['configurable'] = sprintf( '%2$s', esc_url( $module_array['configure_url'] ), __( 'Configure', 'jetpack' ) );
+ }
+
+ $modules[ $module ] = $module_array;
+ }
+ }
+
+ uasort( $modules, array( $this->jetpack, 'sort_modules' ) );
+
+ if ( ! Jetpack::is_active() ) {
+ uasort( $modules, array( __CLASS__, 'sort_requires_connection_last' ) );
+ }
+
+ return $modules;
+ }
+
+ static function is_module_available( $module ) {
+ if ( ! is_array( $module ) || empty( $module ) ) {
+ return false;
+ }
+
+ /**
+ * We never want to show VaultPress as activatable through Jetpack.
+ */
+ if ( 'vaultpress' === $module['module'] ) {
+ return false;
+ }
+
+ if ( Jetpack::is_development_mode() ) {
+ return ! ( $module['requires_connection'] );
+ } else {
+ if ( ! Jetpack::is_active() ) {
+ return false;
+ }
+
+ return Jetpack_Plan::supports( $module['module'] );
+ }
+ }
+
+ function handle_unrecognized_action( $action ) {
+ switch ( $action ) {
+ case 'bulk-activate':
+ if ( ! current_user_can( 'jetpack_activate_modules' ) ) {
+ break;
+ }
+
+ $modules = (array) $_GET['modules'];
+ $modules = array_map( 'sanitize_key', $modules );
+ check_admin_referer( 'bulk-jetpack_page_jetpack_modules' );
+ foreach ( $modules as $module ) {
+ Jetpack::log( 'activate', $module );
+ Jetpack::activate_module( $module, false );
+ }
+ // The following two lines will rarely happen, as Jetpack::activate_module normally exits at the end.
+ wp_safe_redirect( wp_get_referer() );
+ exit;
+ case 'bulk-deactivate':
+ if ( ! current_user_can( 'jetpack_deactivate_modules' ) ) {
+ break;
+ }
+
+ $modules = (array) $_GET['modules'];
+ $modules = array_map( 'sanitize_key', $modules );
+ check_admin_referer( 'bulk-jetpack_page_jetpack_modules' );
+ foreach ( $modules as $module ) {
+ Jetpack::log( 'deactivate', $module );
+ Jetpack::deactivate_module( $module );
+ Jetpack::state( 'message', 'module_deactivated' );
+ }
+ Jetpack::state( 'module', $modules );
+ wp_safe_redirect( wp_get_referer() );
+ exit;
+ default:
+ return;
+ }
+ }
+
+ function fix_redirect( $module, $redirect = true ) {
+ if ( ! $redirect ) {
+ return;
+ }
+ if ( wp_get_referer() ) {
+ add_filter( 'wp_redirect', 'wp_get_referer' );
+ }
+ }
+
+ function admin_menu_debugger() {
+ jetpack_require_lib( 'debugger' );
+ Jetpack_Debugger::disconnect_and_redirect();
+ $debugger_hook = add_submenu_page(
+ null,
+ __( 'Debugging Center', 'jetpack' ),
+ '',
+ 'manage_options',
+ 'jetpack-debugger',
+ array( $this, 'wrap_debugger_page' )
+ );
+ add_action( "admin_head-$debugger_hook", array( 'Jetpack_Debugger', 'jetpack_debug_admin_head' ) );
+ }
+
+ function wrap_debugger_page() {
+ nocache_headers();
+ if ( ! current_user_can( 'manage_options' ) ) {
+ die( '-1' );
+ }
+ Jetpack_Admin_Page::wrap_ui( array( $this, 'debugger_page' ) );
+ }
+
+ function debugger_page() {
+ jetpack_require_lib( 'debugger' );
+ Jetpack_Debugger::jetpack_debug_display_handler();
+ }
+}
+Jetpack_Admin::init();
diff --git a/wp-content/plugins/jetpack/class.jetpack-affiliate.php b/wp-content/plugins/jetpack/class.jetpack-affiliate.php
new file mode 100644
index 000000000..c2fded634
--- /dev/null
+++ b/wp-content/plugins/jetpack/class.jetpack-affiliate.php
@@ -0,0 +1,78 @@
+get_affiliate_code() ) ) {
+ $url = add_query_arg( 'aff', $aff, $url );
+ }
+ return $url;
+ }
+}
+
+add_action( 'init', array( 'Jetpack_Affiliate', 'init' ) );
diff --git a/wp-content/plugins/jetpack/class.jetpack-autoupdate.php b/wp-content/plugins/jetpack/class.jetpack-autoupdate.php
new file mode 100644
index 000000000..fde4a210d
--- /dev/null
+++ b/wp-content/plugins/jetpack/class.jetpack-autoupdate.php
@@ -0,0 +1,306 @@
+ array(),
+ 'theme' => array(),
+ );
+
+ private $failed = array(
+ 'plugin' => array(),
+ 'theme' => array(),
+ );
+
+ private static $instance = null;
+
+ static function init() {
+ if ( is_null( self::$instance ) ) {
+ self::$instance = new Jetpack_Autoupdate();
+ }
+
+ return self::$instance;
+ }
+
+ private function __construct() {
+ if (
+ /** This filter is documented in class.jetpack-json-api-endpoint.php */
+ apply_filters( 'jetpack_json_manage_api_enabled', true )
+ ) {
+ add_filter( 'auto_update_theme', array( $this, 'autoupdate_theme' ), 10, 2 );
+ add_filter( 'auto_update_core', array( $this, 'autoupdate_core' ), 10, 2 );
+ add_filter( 'auto_update_translation', array( $this, 'autoupdate_translation' ), 10, 2 );
+ add_action( 'automatic_updates_complete', array( $this, 'automatic_updates_complete' ), 999, 1 );
+ }
+ }
+
+ public function autoupdate_translation( $update, $item ) {
+ // Autoupdate all translations
+ if ( Jetpack_Options::get_option( 'autoupdate_translations', false ) ) {
+ return true;
+ }
+
+ // Themes
+ $autoupdate_themes_translations = Jetpack_Options::get_option( 'autoupdate_themes_translations', array() );
+ $autoupdate_theme_list = Jetpack_Options::get_option( 'autoupdate_themes', array() );
+
+ /*
+ $item = {
+ "type":"theme",
+ "slug":"twentyfourteen",
+ "language":"en_CA",
+ "version":"1.8",
+ "updated":"2015-07-18 11:27:20",
+ "package":"https:\/\/downloads.wordpress.org\/translation\/theme\/twentyfourteen\/1.8\/en_CA.zip",
+ "autoupdate":true
+ }
+ */
+ if ( ( in_array( $item->slug, $autoupdate_themes_translations )
+ || in_array( $item->slug, $autoupdate_theme_list ) )
+ && 'theme' === $item->type
+ ) {
+ $this->expect( $item->type . ':' . $item->slug, 'translation' );
+
+ return true;
+ }
+
+ // Plugins
+ $autoupdate_plugin_translations = Jetpack_Options::get_option( 'autoupdate_plugins_translations', array() );
+ $autoupdate_plugin_list = Jetpack_Options::get_option( 'autoupdate_plugins', array() );
+ $plugin_files = array_unique( array_merge( $autoupdate_plugin_list, $autoupdate_plugin_translations ) );
+ $plugin_slugs = array_map( array( __CLASS__, 'get_plugin_slug' ), $plugin_files );
+
+ if ( in_array( $item->slug, $plugin_slugs )
+ && 'plugin' === $item->type
+ ) {
+ $this->expect( $item->type . ':' . $item->slug, 'translation' );
+ return true;
+ }
+
+ return $update;
+ }
+
+ public function autoupdate_theme( $update, $item ) {
+ $autoupdate_theme_list = Jetpack_Options::get_option( 'autoupdate_themes', array() );
+ if ( in_array( $item->theme, $autoupdate_theme_list ) ) {
+ $this->expect( $item->theme, 'theme' );
+ return true;
+ }
+
+ return $update;
+ }
+
+ public function autoupdate_core( $update, $item ) {
+ $autoupdate_core = Jetpack_Options::get_option( 'autoupdate_core', false );
+ if ( $autoupdate_core ) {
+ return $autoupdate_core;
+ }
+
+ return $update;
+ }
+
+ /**
+ * Stores the an item identifier to the expected array.
+ *
+ * @param string $item Example: 'jetpack/jetpack.php' for type 'plugin' or 'twentyfifteen' for type 'theme'
+ * @param string $type 'plugin' or 'theme'
+ */
+ private function expect( $item, $type ) {
+ if ( ! isset( $this->expected[ $type ] ) ) {
+ $this->expected[ $type ] = array();
+ }
+ $this->expected[ $type ][] = $item;
+ }
+
+ /**
+ * On completion of an automatic update, let's store the results.
+ *
+ * @param $results - Sent by WP_Automatic_Updater after it completes an autoupdate action. Results may be empty.
+ */
+ public function automatic_updates_complete( $results ) {
+ if ( empty( $this->expected ) ) {
+ return;
+ }
+ $this->results = empty( $results ) ? self::get_possible_failures() : $results;
+
+ add_action( 'shutdown', array( $this, 'bump_stats' ) );
+
+ Jetpack::init();
+
+ $items_to_log = array( 'plugin', 'theme', 'translation' );
+ foreach ( $items_to_log as $items ) {
+ $this->log_items( $items );
+ }
+
+ Jetpack::log( 'autoupdates', $this->get_log() );
+ }
+
+ public function get_log() {
+ return array(
+ 'results' => $this->results,
+ 'failed' => $this->failed,
+ 'success' => $this->success,
+ );
+ }
+
+ /**
+ * Iterates through expected items ( plugins or themes ) and compares them to actual results.
+ *
+ * @param $items 'plugin' or 'theme'
+ */
+ private function log_items( $items ) {
+ if ( ! isset( $this->expected[ $items ] ) ) {
+ return;
+ }
+
+ $item_results = $this->get_successful_updates( $items );
+
+ if ( is_array( $this->expected[ $items ] ) ) {
+ foreach ( $this->expected[ $items ] as $item ) {
+ if ( in_array( $item, $item_results ) ) {
+ $this->success[ $items ][] = $item;
+ } else {
+ $this->failed[ $items ][] = $item;
+ }
+ }
+ }
+ }
+
+ public function bump_stats() {
+ $instance = Jetpack::init();
+ $log = array();
+ // Bump numbers
+
+ if ( ! empty( $this->success['theme'] ) ) {
+ $instance->stat( 'autoupdates/theme-success', count( $this->success['theme'] ) );
+ $log['themes_success'] = $this->success['theme'];
+ }
+
+ if ( ! empty( $this->failed['theme'] ) ) {
+ $instance->stat( 'autoupdates/theme-fail', count( $this->failed['theme'] ) );
+ $log['themes_failed'] = $this->failed['theme'];
+ }
+
+ $instance->do_stats( 'server_side' );
+
+ // Send a more detailed log to logstash
+ if ( ! empty( $log ) ) {
+ $xml = new Jetpack_IXR_Client(
+ array(
+ 'user_id' => get_current_user_id(),
+ )
+ );
+ $log['blog_id'] = Jetpack_Options::get_option( 'id' );
+ $xml->query( 'jetpack.debug_autoupdate', $log );
+ }
+ }
+
+ /**
+ * Parses the autoupdate results generated by WP_Automatic_Updater and returns a simple array of successful items
+ *
+ * @param string $type 'plugin' or 'theme'
+ *
+ * @return array
+ */
+ private function get_successful_updates( $type ) {
+ $successful_updates = array();
+
+ if ( ! isset( $this->results[ $type ] ) ) {
+ return $successful_updates;
+ }
+
+ foreach ( $this->results[ $type ] as $result ) {
+ if ( $result->result ) {
+ switch ( $type ) {
+ case 'theme':
+ $successful_updates[] = $result->item->theme;
+ break;
+ case 'translation':
+ $successful_updates[] = $result->item->type . ':' . $result->item->slug;
+ break;
+ }
+ }
+ }
+
+ return $successful_updates;
+ }
+
+ static function get_possible_failures() {
+ $result = array();
+ // Lets check some reasons why it might not be working as expected
+ include_once ABSPATH . '/wp-admin/includes/admin.php';
+ include_once ABSPATH . '/wp-admin/includes/class-wp-upgrader.php';
+ $upgrader = new WP_Automatic_Updater();
+
+ if ( $upgrader->is_disabled() ) {
+ $result[] = 'autoupdates-disabled';
+ }
+ if ( ! is_main_site() ) {
+ $result[] = 'is-not-main-site';
+ }
+ if ( ! is_main_network() ) {
+ $result[] = 'is-not-main-network';
+ }
+ if ( $upgrader->is_vcs_checkout( ABSPATH ) ) {
+ $result[] = 'site-on-vcs';
+ }
+ if ( $upgrader->is_vcs_checkout( WP_PLUGIN_DIR ) ) {
+ $result[] = 'plugin-directory-on-vcs';
+ }
+ if ( $upgrader->is_vcs_checkout( WP_CONTENT_DIR ) ) {
+ $result[] = 'content-directory-on-vcs';
+ }
+ $lock = get_option( 'auto_updater.lock' );
+ if ( $lock > ( time() - HOUR_IN_SECONDS ) ) {
+ $result[] = 'lock-is-set';
+ }
+ $skin = new Automatic_Upgrader_Skin();
+ include_once ABSPATH . 'wp-admin/includes/file.php';
+ include_once ABSPATH . 'wp-admin/includes/template.php';
+ if ( ! $skin->request_filesystem_credentials( false, ABSPATH, false ) ) {
+ $result[] = 'no-system-write-access';
+ }
+ if ( ! $skin->request_filesystem_credentials( false, WP_PLUGIN_DIR, false ) ) {
+ $result[] = 'no-plugin-directory-write-access';
+ }
+ if ( ! $skin->request_filesystem_credentials( false, WP_CONTENT_DIR, false ) ) {
+ $result[] = 'no-wp-content-directory-write-access';
+ }
+
+ return $result;
+ }
+
+ static function get_plugin_slug( $plugin_file ) {
+ $update_plugins = get_site_transient( 'update_plugins' );
+ if ( isset( $update_plugins->no_update ) ) {
+ if ( isset( $update_plugins->no_update[ $plugin_file ] ) ) {
+ $slug = $update_plugins->no_update[ $plugin_file ]->slug;
+ }
+ }
+ if ( empty( $slug ) && isset( $update_plugins->response ) ) {
+ if ( isset( $update_plugins->response[ $plugin_file ] ) ) {
+ $slug = $update_plugins->response[ $plugin_file ]->slug;
+ }
+ }
+
+ // Try to infer from the plugin file if not cached
+ if ( empty( $slug ) ) {
+ $slug = dirname( $plugin_file );
+ if ( '.' === $slug ) {
+ $slug = preg_replace( '/(.+)\.php$/', '$1', $plugin_file );
+ }
+ }
+ return $slug;
+ }
+
+}
+
+Jetpack_Autoupdate::init();
diff --git a/wp-content/plugins/jetpack/class.jetpack-bbpress-json-api-compat.php b/wp-content/plugins/jetpack/class.jetpack-bbpress-json-api-compat.php
new file mode 100644
index 000000000..ae99d250b
--- /dev/null
+++ b/wp-content/plugins/jetpack/class.jetpack-bbpress-json-api-compat.php
@@ -0,0 +1,102 @@
+post_type );
+ }
+ } elseif ( is_string( $args[0] ) ) {
+ $post_type = get_post_type_object( $args[0] );
+ }
+
+ // no post type found, bail
+ if ( empty( $post_type ) ) {
+ return $caps;
+ }
+
+ // reset the needed caps
+ $caps = array();
+
+ // Add 'do_not_allow' cap if user is spam or deleted
+ if ( bbp_is_user_inactive( $user_id ) ) {
+ $caps[] = 'do_not_allow';
+
+ // Moderators can always edit meta
+ } elseif ( user_can( $user_id, 'moderate' ) ) {
+ $caps[] = 'moderate';
+
+ // Unknown so map to edit_posts
+ } else {
+ $caps[] = $post_type->cap->edit_posts;
+ }
+
+ return $caps;
+ }
+
+}
+
+bbPress_Jetpack_REST_API::instance();
diff --git a/wp-content/plugins/jetpack/class.jetpack-cli.php b/wp-content/plugins/jetpack/class.jetpack-cli.php
new file mode 100644
index 000000000..d05cb7ca6
--- /dev/null
+++ b/wp-content/plugins/jetpack/class.jetpack-cli.php
@@ -0,0 +1,2024 @@
+pass() ) {
+ $cxntests->output_results_for_cli();
+
+ WP_CLI::success( __( 'Jetpack is currently connected to WordPress.com', 'jetpack' ) );
+ } else {
+ $error = array();
+ foreach ( $cxntests->list_fails() as $fail ) {
+ $error[] = $fail['name'] . ': ' . $fail['message'];
+ }
+ WP_CLI::error_multi_line( $error );
+
+ $cxntests->output_results_for_cli();
+
+ WP_CLI::error( __( 'Jetpack connection is broken.', 'jetpack' ) ); // Exit CLI.
+ }
+
+ /* translators: %s is current version of Jetpack, for example 7.3 */
+ WP_CLI::line( sprintf( __( 'The Jetpack Version is %s', 'jetpack' ), JETPACK__VERSION ) );
+ /* translators: %d is WP.com ID of this blog */
+ WP_CLI::line( sprintf( __( 'The WordPress.com blog_id is %d', 'jetpack' ), Jetpack_Options::get_option( 'id' ) ) );
+ /* translators: %s is the email address of the connection owner */
+ WP_CLI::line( sprintf( __( 'The WordPress.com account for the primary connection is %s', 'jetpack' ), $master_user_email ) );
+
+ /*
+ * Are they asking for all data?
+ *
+ * Loop through heartbeat data and organize by priority.
+ */
+ $all_data = ( isset( $args[0] ) && 'full' == $args[0] ) ? 'full' : false;
+ if ( $all_data ) {
+ // Heartbeat data
+ WP_CLI::line( "\n" . __( 'Additional data: ', 'jetpack' ) );
+
+ // Get the filtered heartbeat data.
+ // Filtered so we can color/list by severity
+ $stats = Jetpack::jetpack_check_heartbeat_data();
+
+ // Display red flags first
+ foreach ( $stats['bad'] as $stat => $value ) {
+ printf( "$this->red_open%-'.16s %s $this->color_close\n", $stat, $value );
+ }
+
+ // Display caution warnings next
+ foreach ( $stats['caution'] as $stat => $value ) {
+ printf( "$this->yellow_open%-'.16s %s $this->color_close\n", $stat, $value );
+ }
+
+ // The rest of the results are good!
+ foreach ( $stats['good'] as $stat => $value ) {
+
+ // Modules should get special spacing for aestetics
+ if ( strpos( $stat, 'odule-' ) ) {
+ printf( "%-'.30s %s\n", $stat, $value );
+ usleep( 4000 ); // For dramatic effect lolz
+ continue;
+ }
+ printf( "%-'.16s %s\n", $stat, $value );
+ usleep( 4000 ); // For dramatic effect lolz
+ }
+ } else {
+ // Just the basics
+ WP_CLI::line( "\n" . _x( "View full status with 'wp jetpack status full'", '"wp jetpack status full" is a command - do not translate', 'jetpack' ) );
+ }
+ }
+
+ /**
+ * Tests the active connection
+ *
+ * Does a two-way test to verify that the local site can communicate with remote Jetpack/WP.com servers and that Jetpack/WP.com servers can talk to the local site.
+ *
+ * ## EXAMPLES
+ *
+ * wp jetpack test-connection
+ *
+ * @subcommand test-connection
+ */
+ public function test_connection( $args, $assoc_args ) {
+
+ /* translators: %s is the site URL */
+ WP_CLI::line( sprintf( __( 'Testing connection for %s', 'jetpack' ), esc_url( get_site_url() ) ) );
+
+ if ( ! Jetpack::is_active() ) {
+ WP_CLI::error( __( 'Jetpack is not currently connected to WordPress.com', 'jetpack' ) );
+ }
+
+ $response = Client::wpcom_json_api_request_as_blog(
+ sprintf( '/jetpack-blogs/%d/test-connection', Jetpack_Options::get_option( 'id' ) ),
+ Client::WPCOM_JSON_API_VERSION
+ );
+
+ if ( is_wp_error( $response ) ) {
+ /* translators: %1$s is the error code, %2$s is the error message */
+ WP_CLI::error( sprintf( __( 'Failed to test connection (#%1$s: %2$s)', 'jetpack' ), $response->get_error_code(), $response->get_error_message() ) );
+ }
+
+ $body = wp_remote_retrieve_body( $response );
+ if ( ! $body ) {
+ WP_CLI::error( __( 'Failed to test connection (empty response body)', 'jetpack' ) );
+ }
+
+ $result = json_decode( $body );
+ $is_connected = (bool) $result->connected;
+ $message = $result->message;
+
+ if ( $is_connected ) {
+ WP_CLI::success( $message );
+ } else {
+ WP_CLI::error( $message );
+ }
+ }
+
+ /**
+ * Disconnect Jetpack Blogs or Users
+ *
+ * ## OPTIONS
+ *
+ * blog: Disconnect the entire blog.
+ *
+ * user : Disconnect a specific user from WordPress.com.
+ *
+ * Please note, the primary account that the blog is connected
+ * to WordPress.com with cannot be disconnected without
+ * disconnecting the entire blog.
+ *
+ * ## EXAMPLES
+ *
+ * wp jetpack disconnect blog
+ * wp jetpack disconnect user 13
+ * wp jetpack disconnect user username
+ * wp jetpack disconnect user email@domain.com
+ *
+ * @synopsis []
+ */
+ public function disconnect( $args, $assoc_args ) {
+ if ( ! Jetpack::is_active() ) {
+ WP_CLI::success( __( 'The site is not currently connected, so nothing to do!', 'jetpack' ) );
+ return;
+ }
+
+ $action = isset( $args[0] ) ? $args[0] : 'prompt';
+ if ( ! in_array( $action, array( 'blog', 'user', 'prompt' ) ) ) {
+ /* translators: %s is a command like "prompt" */
+ WP_CLI::error( sprintf( __( '%s is not a valid command.', 'jetpack' ), $action ) );
+ }
+
+ if ( in_array( $action, array( 'user' ) ) ) {
+ if ( isset( $args[1] ) ) {
+ $user_id = $args[1];
+ if ( ctype_digit( $user_id ) ) {
+ $field = 'id';
+ $user_id = (int) $user_id;
+ } elseif ( is_email( $user_id ) ) {
+ $field = 'email';
+ $user_id = sanitize_user( $user_id, true );
+ } else {
+ $field = 'login';
+ $user_id = sanitize_user( $user_id, true );
+ }
+ if ( ! $user = get_user_by( $field, $user_id ) ) {
+ WP_CLI::error( __( 'Please specify a valid user.', 'jetpack' ) );
+ }
+ } else {
+ WP_CLI::error( __( 'Please specify a user by either ID, username, or email.', 'jetpack' ) );
+ }
+ }
+
+ switch ( $action ) {
+ case 'blog':
+ Jetpack::log( 'disconnect' );
+ Jetpack::disconnect();
+ WP_CLI::success(
+ sprintf(
+ /* translators: %s is the site URL */
+ __( 'Jetpack has been successfully disconnected for %s.', 'jetpack' ),
+ esc_url( get_site_url() )
+ )
+ );
+ break;
+ case 'user':
+ if ( Connection_Manager::disconnect_user( $user->ID ) ) {
+ Jetpack::log( 'unlink', $user->ID );
+ WP_CLI::success( __( 'User has been successfully disconnected.', 'jetpack' ) );
+ } else {
+ /* translators: %s is a username */
+ WP_CLI::error( sprintf( __( "User %s could not be disconnected. Are you sure they're connected currently?", 'jetpack' ), "{$user->login} <{$user->email}>" ) );
+ }
+ break;
+ case 'prompt':
+ WP_CLI::error( __( 'Please specify if you would like to disconnect a blog or user.', 'jetpack' ) );
+ break;
+ }
+ }
+
+ /**
+ * Reset Jetpack options and settings to default
+ *
+ * ## OPTIONS
+ *
+ * modules: Resets modules to default state ( get_default_modules() )
+ *
+ * options: Resets all Jetpack options except:
+ * - All private options (Blog token, user token, etc...)
+ * - id (The Client ID/WP.com Blog ID of this site)
+ * - master_user
+ * - version
+ * - activated
+ *
+ * ## EXAMPLES
+ *
+ * wp jetpack reset options
+ * wp jetpack reset modules
+ * wp jetpack reset sync-checksum --dry-run --offset=0
+ *
+ * @synopsis [--dry-run] [--offset=]
+ */
+ public function reset( $args, $assoc_args ) {
+ $action = isset( $args[0] ) ? $args[0] : 'prompt';
+ if ( ! in_array( $action, array( 'options', 'modules', 'sync-checksum' ), true ) ) {
+ /* translators: %s is a command like "prompt" */
+ WP_CLI::error( sprintf( __( '%s is not a valid command.', 'jetpack' ), $action ) );
+ }
+
+ $is_dry_run = ! empty( $assoc_args['dry-run'] );
+
+ if ( $is_dry_run ) {
+ WP_CLI::warning(
+ __( "\nThis is a dry run.\n", 'jetpack' ) .
+ __( "No actions will be taken.\n", 'jetpack' ) .
+ __( "The following messages will give you preview of what will happen when you run this command.\n\n", 'jetpack' )
+ );
+ } else {
+ // We only need to confirm "Are you sure?" when we are not doing a dry run.
+ jetpack_cli_are_you_sure();
+ }
+
+ switch ( $action ) {
+ case 'options':
+ $options_to_reset = Jetpack_Options::get_options_for_reset();
+ // Reset the Jetpack options
+ WP_CLI::line(
+ sprintf(
+ /* translators: %s is the site URL */
+ __( "Resetting Jetpack Options for %s...\n", 'jetpack' ),
+ esc_url( get_site_url() )
+ )
+ );
+ sleep( 1 ); // Take a breath
+ foreach ( $options_to_reset['jp_options'] as $option_to_reset ) {
+ if ( ! $is_dry_run ) {
+ Jetpack_Options::delete_option( $option_to_reset );
+ usleep( 100000 );
+ }
+
+ /* translators: This is the result of an action. The option named %s was reset */
+ WP_CLI::success( sprintf( __( '%s option reset', 'jetpack' ), $option_to_reset ) );
+ }
+
+ // Reset the WP options
+ WP_CLI::line( __( "Resetting the jetpack options stored in wp_options...\n", 'jetpack' ) );
+ usleep( 500000 ); // Take a breath
+ foreach ( $options_to_reset['wp_options'] as $option_to_reset ) {
+ if ( ! $is_dry_run ) {
+ delete_option( $option_to_reset );
+ usleep( 100000 );
+ }
+ /* translators: This is the result of an action. The option named %s was reset */
+ WP_CLI::success( sprintf( __( '%s option reset', 'jetpack' ), $option_to_reset ) );
+ }
+
+ // Reset to default modules
+ WP_CLI::line( __( "Resetting default modules...\n", 'jetpack' ) );
+ usleep( 500000 ); // Take a breath
+ $default_modules = Jetpack::get_default_modules();
+ if ( ! $is_dry_run ) {
+ Jetpack::update_active_modules( $default_modules );
+ }
+ WP_CLI::success( __( 'Modules reset to default.', 'jetpack' ) );
+ break;
+ case 'modules':
+ if ( ! $is_dry_run ) {
+ $default_modules = Jetpack::get_default_modules();
+ Jetpack::update_active_modules( $default_modules );
+ }
+
+ WP_CLI::success( __( 'Modules reset to default.', 'jetpack' ) );
+ break;
+ case 'prompt':
+ WP_CLI::error( __( 'Please specify if you would like to reset your options, modules or sync-checksum', 'jetpack' ) );
+ break;
+ case 'sync-checksum':
+ $option = 'jetpack_callables_sync_checksum';
+
+ if ( is_multisite() ) {
+ $offset = isset( $assoc_args['offset'] ) ? (int) $assoc_args['offset'] : 0;
+
+ /*
+ * 1000 is a good limit since we don't expect the number of sites to be more than 1000
+ * Offset can be used to paginate and try to clean up more sites.
+ */
+ $sites = get_sites(
+ array(
+ 'number' => 1000,
+ 'offset' => $offset,
+ )
+ );
+ $count_fixes = 0;
+ foreach ( $sites as $site ) {
+ switch_to_blog( $site->blog_id );
+ $count = self::count_option( $option );
+ if ( $count > 1 ) {
+ if ( ! $is_dry_run ) {
+ delete_option( $option );
+ }
+ WP_CLI::line(
+ sprintf(
+ /* translators: %1$d is a number, %2$s is the name of an option, %2$s is the site URL. */
+ __( 'Deleted %1$d %2$s options from %3$s', 'jetpack' ),
+ $count,
+ $option,
+ "{$site->domain}{$site->path}"
+ )
+ );
+ $count_fixes++;
+ if ( ! $is_dry_run ) {
+ /*
+ * We could be deleting a lot of options rows at the same time.
+ * Allow some time for replication to catch up.
+ */
+ sleep( 3 );
+ }
+ }
+
+ restore_current_blog();
+ }
+ if ( $count_fixes ) {
+ WP_CLI::success(
+ sprintf(
+ /* translators: %1$s is the name of an option, %2$d is a number of sites. */
+ __( 'Successfully reset %1$s on %2$d sites.', 'jetpack' ),
+ $option,
+ $count_fixes
+ )
+ );
+ } else {
+ WP_CLI::success( __( 'No options were deleted.', 'jetpack' ) );
+ }
+ return;
+ }
+
+ $count = self::count_option( $option );
+ if ( $count > 1 ) {
+ if ( ! $is_dry_run ) {
+ delete_option( $option );
+ }
+ WP_CLI::success(
+ sprintf(
+ /* translators: %1$d is a number, %2$s is the name of an option. */
+ __( 'Deleted %1$d %2$s options', 'jetpack' ),
+ $count,
+ $option
+ )
+ );
+ return;
+ }
+
+ WP_CLI::success( __( 'No options were deleted.', 'jetpack' ) );
+ break;
+
+ }
+ }
+
+ /**
+ * Return the number of times an option appears
+ * Normally an option would only appear 1 since the option key is supposed to be unique
+ * but if a site hasn't updated the DB schema then that would not be the case.
+ *
+ * @param string $option Option name.
+ *
+ * @return int
+ */
+ private static function count_option( $option ) {
+ global $wpdb;
+ return (int) $wpdb->get_var(
+ $wpdb->prepare(
+ "SELECT COUNT(*) FROM $wpdb->options WHERE option_name = %s",
+ $option
+ )
+ );
+
+ }
+
+ /**
+ * Manage Jetpack Modules
+ *
+ * ## OPTIONS
+ *
+ *
+ * : The action to take.
+ * ---
+ * default: list
+ * options:
+ * - list
+ * - activate
+ * - deactivate
+ * - toggle
+ * ---
+ *
+ * []
+ * : The slug of the module to perform an action on.
+ *
+ * [--format=]
+ * : Allows overriding the output of the command when listing modules.
+ * ---
+ * default: table
+ * options:
+ * - table
+ * - json
+ * - csv
+ * - yaml
+ * - ids
+ * - count
+ * ---
+ *
+ * ## EXAMPLES
+ *
+ * wp jetpack module list
+ * wp jetpack module list --format=json
+ * wp jetpack module activate stats
+ * wp jetpack module deactivate stats
+ * wp jetpack module toggle stats
+ * wp jetpack module activate all
+ * wp jetpack module deactivate all
+ */
+ public function module( $args, $assoc_args ) {
+ $action = isset( $args[0] ) ? $args[0] : 'list';
+
+ if ( isset( $args[1] ) ) {
+ $module_slug = $args[1];
+ if ( 'all' !== $module_slug && ! Jetpack::is_module( $module_slug ) ) {
+ /* translators: %s is a module slug like "stats" */
+ WP_CLI::error( sprintf( __( '%s is not a valid module.', 'jetpack' ), $module_slug ) );
+ }
+ if ( 'toggle' === $action ) {
+ $action = Jetpack::is_module_active( $module_slug )
+ ? 'deactivate'
+ : 'activate';
+ }
+ if ( 'all' === $args[1] ) {
+ $action = ( 'deactivate' === $action )
+ ? 'deactivate_all'
+ : 'activate_all';
+ }
+ } elseif ( 'list' !== $action ) {
+ WP_CLI::line( __( 'Please specify a valid module.', 'jetpack' ) );
+ $action = 'list';
+ }
+
+ switch ( $action ) {
+ case 'list':
+ $modules_list = array();
+ $modules = Jetpack::get_available_modules();
+ sort( $modules );
+ foreach ( (array) $modules as $module_slug ) {
+ if ( 'vaultpress' === $module_slug ) {
+ continue;
+ }
+ $modules_list[] = array(
+ 'slug' => $module_slug,
+ 'status' => Jetpack::is_module_active( $module_slug )
+ ? __( 'Active', 'jetpack' )
+ : __( 'Inactive', 'jetpack' ),
+ );
+ }
+ WP_CLI\Utils\format_items( $assoc_args['format'], $modules_list, array( 'slug', 'status' ) );
+ break;
+ case 'activate':
+ $module = Jetpack::get_module( $module_slug );
+ Jetpack::log( 'activate', $module_slug );
+ if ( Jetpack::activate_module( $module_slug, false, false ) ) {
+ /* translators: %s is the name of a Jetpack module */
+ WP_CLI::success( sprintf( __( '%s has been activated.', 'jetpack' ), $module['name'] ) );
+ } else {
+ /* translators: %s is the name of a Jetpack module */
+ WP_CLI::error( sprintf( __( '%s could not be activated.', 'jetpack' ), $module['name'] ) );
+ }
+ break;
+ case 'activate_all':
+ $modules = Jetpack::get_available_modules();
+ Jetpack::update_active_modules( $modules );
+ WP_CLI::success( __( 'All modules activated!', 'jetpack' ) );
+ break;
+ case 'deactivate':
+ $module = Jetpack::get_module( $module_slug );
+ Jetpack::log( 'deactivate', $module_slug );
+ Jetpack::deactivate_module( $module_slug );
+ /* translators: %s is the name of a Jetpack module */
+ WP_CLI::success( sprintf( __( '%s has been deactivated.', 'jetpack' ), $module['name'] ) );
+ break;
+ case 'deactivate_all':
+ Jetpack::delete_active_modules();
+ WP_CLI::success( __( 'All modules deactivated!', 'jetpack' ) );
+ break;
+ case 'toggle':
+ // Will never happen, should have been handled above and changed to activate or deactivate.
+ break;
+ }
+ }
+
+ /**
+ * Manage Protect Settings
+ *
+ * ## OPTIONS
+ *
+ * whitelist: Whitelist an IP address. You can also read or clear the whitelist.
+ *
+ *
+ * ## EXAMPLES
+ *
+ * wp jetpack protect whitelist
+ * wp jetpack protect whitelist list
+ * wp jetpack protect whitelist clear
+ *
+ * @synopsis []
+ */
+ public function protect( $args, $assoc_args ) {
+ $action = isset( $args[0] ) ? $args[0] : 'prompt';
+ if ( ! in_array( $action, array( 'whitelist' ) ) ) {
+ /* translators: %s is a command like "prompt" */
+ WP_CLI::error( sprintf( __( '%s is not a valid command.', 'jetpack' ), $action ) );
+ }
+ // Check if module is active
+ if ( ! Jetpack::is_module_active( __FUNCTION__ ) ) {
+ /* translators: %s is a module name */
+ WP_CLI::error( sprintf( _x( '%1$s is not active. You can activate it with "wp jetpack module activate %2$s"', '"wp jetpack module activate" is a command - do not translate', 'jetpack' ), __FUNCTION__, __FUNCTION__ ) );
+ }
+ if ( in_array( $action, array( 'whitelist' ) ) ) {
+ if ( isset( $args[1] ) ) {
+ $action = 'whitelist';
+ } else {
+ $action = 'prompt';
+ }
+ }
+ switch ( $action ) {
+ case 'whitelist':
+ $whitelist = array();
+ $new_ip = $args[1];
+ $current_whitelist = get_site_option( 'jetpack_protect_whitelist', array() );
+
+ // Build array of IPs that are already whitelisted.
+ // Re-build manually instead of using jetpack_protect_format_whitelist() so we can easily get
+ // low & high range params for jetpack_protect_ip_address_is_in_range();
+ foreach ( $current_whitelist as $whitelisted ) {
+
+ // IP ranges
+ if ( $whitelisted->range ) {
+
+ // Is it already whitelisted?
+ if ( jetpack_protect_ip_address_is_in_range( $new_ip, $whitelisted->range_low, $whitelisted->range_high ) ) {
+ /* translators: %s is an IP address */
+ WP_CLI::error( sprintf( __( '%s has already been whitelisted', 'jetpack' ), $new_ip ) );
+ break;
+ }
+ $whitelist[] = $whitelisted->range_low . ' - ' . $whitelisted->range_high;
+
+ } else { // Individual IPs
+
+ // Check if the IP is already whitelisted (single IP only)
+ if ( $new_ip == $whitelisted->ip_address ) {
+ /* translators: %s is an IP address */
+ WP_CLI::error( sprintf( __( '%s has already been whitelisted', 'jetpack' ), $new_ip ) );
+ break;
+ }
+ $whitelist[] = $whitelisted->ip_address;
+
+ }
+ }
+
+ /*
+ * List the whitelist
+ * Done here because it's easier to read the $whitelist array after it's been rebuilt
+ */
+ if ( isset( $args[1] ) && 'list' == $args[1] ) {
+ if ( ! empty( $whitelist ) ) {
+ WP_CLI::success( __( 'Here are your whitelisted IPs:', 'jetpack' ) );
+ foreach ( $whitelist as $ip ) {
+ WP_CLI::line( "\t" . str_pad( $ip, 24 ) );
+ }
+ } else {
+ WP_CLI::line( __( 'Whitelist is empty.', 'jetpack' ) );
+ }
+ break;
+ }
+
+ /*
+ * Clear the whitelist
+ */
+ if ( isset( $args[1] ) && 'clear' == $args[1] ) {
+ if ( ! empty( $whitelist ) ) {
+ $whitelist = array();
+ jetpack_protect_save_whitelist( $whitelist );
+ WP_CLI::success( __( 'Cleared all whitelisted IPs', 'jetpack' ) );
+ } else {
+ WP_CLI::line( __( 'Whitelist is empty.', 'jetpack' ) );
+ }
+ break;
+ }
+
+ // Append new IP to whitelist array
+ array_push( $whitelist, $new_ip );
+
+ // Save whitelist if there are no errors
+ $result = jetpack_protect_save_whitelist( $whitelist );
+ if ( is_wp_error( $result ) ) {
+ WP_CLI::error( $result );
+ }
+
+ /* translators: %s is an IP address */
+ WP_CLI::success( sprintf( __( '%s has been whitelisted.', 'jetpack' ), $new_ip ) );
+ break;
+ case 'prompt':
+ WP_CLI::error(
+ __( 'No command found.', 'jetpack' ) . "\n" .
+ __( 'Please enter the IP address you want to whitelist.', 'jetpack' ) . "\n" .
+ _x( 'You can save a range of IPs {low_range}-{high_range}. No spaces allowed. (example: 1.1.1.1-2.2.2.2)', 'Instructions on how to whitelist IP ranges - low_range/high_range should be translated.', 'jetpack' ) . "\n" .
+ _x( "You can also 'list' or 'clear' the whitelist.", "'list' and 'clear' are commands and should not be translated", 'jetpack' ) . "\n"
+ );
+ break;
+ }
+ }
+
+ /**
+ * Manage Jetpack Options
+ *
+ * ## OPTIONS
+ *
+ * list : List all jetpack options and their values
+ * delete : Delete an option
+ * - can only delete options that are white listed.
+ * update : update an option
+ * - can only update option strings
+ * get : get the value of an option
+ *
+ * ## EXAMPLES
+ *
+ * wp jetpack options list
+ * wp jetpack options get
+ * wp jetpack options delete
+ * wp jetpack options update []
+ *
+ * @synopsis [] []
+ */
+ public function options( $args, $assoc_args ) {
+ $action = isset( $args[0] ) ? $args[0] : 'list';
+ $safe_to_modify = Jetpack_Options::get_options_for_reset();
+
+ // Is the option flagged as unsafe?
+ $flagged = ! in_array( $args[1], $safe_to_modify );
+
+ if ( ! in_array( $action, array( 'list', 'get', 'delete', 'update' ) ) ) {
+ /* translators: %s is a command like "prompt" */
+ WP_CLI::error( sprintf( __( '%s is not a valid command.', 'jetpack' ), $action ) );
+ }
+
+ if ( isset( $args[0] ) ) {
+ if ( 'get' == $args[0] && isset( $args[1] ) ) {
+ $action = 'get';
+ } elseif ( 'delete' == $args[0] && isset( $args[1] ) ) {
+ $action = 'delete';
+ } elseif ( 'update' == $args[0] && isset( $args[1] ) ) {
+ $action = 'update';
+ } else {
+ $action = 'list';
+ }
+ }
+
+ // Bail if the option isn't found
+ $option = isset( $args[1] ) ? Jetpack_Options::get_option( $args[1] ) : false;
+ if ( isset( $args[1] ) && ! $option && 'update' !== $args[0] ) {
+ WP_CLI::error( __( 'Option not found or is empty. Use "list" to list option names', 'jetpack' ) );
+ }
+
+ // Let's print_r the option if it's an array
+ // Used in the 'get' and 'list' actions
+ $option = is_array( $option ) ? print_r( $option ) : $option;
+
+ switch ( $action ) {
+ case 'get':
+ WP_CLI::success( "\t" . $option );
+ break;
+ case 'delete':
+ jetpack_cli_are_you_sure( $flagged );
+
+ Jetpack_Options::delete_option( $args[1] );
+ /* translators: %s is the option name */
+ WP_CLI::success( sprintf( __( 'Deleted option: %s', 'jetpack' ), $args[1] ) );
+ break;
+ case 'update':
+ jetpack_cli_are_you_sure( $flagged );
+
+ // Updating arrays would get pretty tricky...
+ $value = Jetpack_Options::get_option( $args[1] );
+ if ( $value && is_array( $value ) ) {
+ WP_CLI::error( __( 'Sorry, no updating arrays at this time', 'jetpack' ) );
+ }
+
+ Jetpack_Options::update_option( $args[1], $args[2] );
+ /* translators: %1$s is the previous value, %2$s is the new value */
+ WP_CLI::success( sprintf( _x( 'Updated option: %1$s to "%2$s"', 'Updating an option from "this" to "that".', 'jetpack' ), $args[1], $args[2] ) );
+ break;
+ case 'list':
+ $options_compact = Jetpack_Options::get_option_names();
+ $options_non_compact = Jetpack_Options::get_option_names( 'non_compact' );
+ $options_private = Jetpack_Options::get_option_names( 'private' );
+ $options = array_merge( $options_compact, $options_non_compact, $options_private );
+
+ // Table headers
+ WP_CLI::line( "\t" . str_pad( __( 'Option', 'jetpack' ), 30 ) . __( 'Value', 'jetpack' ) );
+
+ // List out the options and their values
+ // Tell them if the value is empty or not
+ // Tell them if it's an array
+ foreach ( $options as $option ) {
+ $value = Jetpack_Options::get_option( $option );
+ if ( ! $value ) {
+ WP_CLI::line( "\t" . str_pad( $option, 30 ) . 'Empty' );
+ continue;
+ }
+
+ if ( ! is_array( $value ) ) {
+ WP_CLI::line( "\t" . str_pad( $option, 30 ) . $value );
+ } elseif ( is_array( $value ) ) {
+ WP_CLI::line( "\t" . str_pad( $option, 30 ) . 'Array - Use "get