From d93e5edb54ef9150612e84973bb597c2b210dd02 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adam=20Zieli=C5=84ski?=
Date: Wed, 20 Dec 2023 10:07:05 +0100
Subject: [PATCH 01/39] Noodling on multisites
---
.../php-wasm/universal/src/lib/base-php.ts | 2 +-
.../php-wasm/web/src/lib/web-php-endpoint.ts | 2 +-
packages/playground/client/src/index.ts | 38 +++++++++++++++++++
3 files changed, 40 insertions(+), 2 deletions(-)
diff --git a/packages/php-wasm/universal/src/lib/base-php.ts b/packages/php-wasm/universal/src/lib/base-php.ts
index c8e552e4e8..1d2ed66e15 100644
--- a/packages/php-wasm/universal/src/lib/base-php.ts
+++ b/packages/php-wasm/universal/src/lib/base-php.ts
@@ -477,7 +477,7 @@ export abstract class BasePHP implements IsomorphicLocalPHP {
}
}
- defineConstant(key: string, value: string | number | null) {
+ defineConstant(key: string, value: string | boolean | number | null) {
let consts = {};
try {
consts = JSON.parse(
diff --git a/packages/php-wasm/web/src/lib/web-php-endpoint.ts b/packages/php-wasm/web/src/lib/web-php-endpoint.ts
index e1be84b76c..75d936845d 100644
--- a/packages/php-wasm/web/src/lib/web-php-endpoint.ts
+++ b/packages/php-wasm/web/src/lib/web-php-endpoint.ts
@@ -179,7 +179,7 @@ export class WebPHPEndpoint implements IsomorphicLocalPHP {
}
/** @inheritDoc @php-wasm/web!WebPHP.defineConstant */
- defineConstant(key: string, value: string | number | null): void {
+ defineConstant(key: string, value: string | boolean | number | null): void {
_private.get(this)!.php.defineConstant(key, value);
}
diff --git a/packages/playground/client/src/index.ts b/packages/playground/client/src/index.ts
index 8d5301484b..9b4ecefd0c 100644
--- a/packages/playground/client/src/index.ts
+++ b/packages/playground/client/src/index.ts
@@ -98,6 +98,44 @@ export async function startPlaygroundWeb({
await runBlueprintSteps(compiled, playground);
progressTracker.finish();
+ await playground.defineConstant('WP_ALLOW_MULTISITE', true);
+ await playground.defineConstant('DOMAIN_CURRENT_SITE', 'localhost:5400');
+ await playground.defineConstant(
+ 'PATH_CURRENT_SITE',
+ new URL(await playground.absoluteUrl).pathname
+ );
+
+ const response = await playground.run({
+ code: `tables( 'ms_global' ) as $table => $prefixed_table ) {
+ $wpdb->$table = $prefixed_table;
+ }
+ require_once '/wordpress/wp-admin/includes/upgrade.php';
+
+ $result = install_network();
+ var_dump($result);
+ require_once '/wordpress/wp-admin/includes/upgrade.php';
+ $base = "${new URL(await playground.absoluteUrl).pathname}";
+ $result = populate_network( 1, "localhost:5400", sanitize_email( "adam@adamziel.com" ), wp_unslash( "My network!" ), $base, $subdomain_install = false );
+ var_dump($result);
+ `,
+ });
+ console.log(response.text);
+
+ await playground.defineConstant('MULTISITE', true);
+ await playground.defineConstant('SUBDOMAIN_INSTALL', false);
+ await playground.defineConstant('SITE_ID_CURRENT_SITE', 1);
+ await playground.defineConstant('BLOG_ID_CURRENT_SITE', 1);
+ console.log('defined');
+
return playground;
}
From 386914e6d9d07ac232954ba5ee777e874e64d9dd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adam=20Zieli=C5=84ski?=
Date: Tue, 23 Jan 2024 11:22:21 +0100
Subject: [PATCH 02/39] Try with a secure TLD
---
.../docs/site/docs/13-contributing/02-code.md | 14 ++
.../web/src/lib/register-service-worker.ts | 11 +-
packages/playground/client/src/index.ts | 121 +++++++++++++-----
3 files changed, 112 insertions(+), 34 deletions(-)
diff --git a/packages/docs/site/docs/13-contributing/02-code.md b/packages/docs/site/docs/13-contributing/02-code.md
index e86f22824a..b898404ff4 100644
--- a/packages/docs/site/docs/13-contributing/02-code.md
+++ b/packages/docs/site/docs/13-contributing/02-code.md
@@ -29,3 +29,17 @@ Be sure to also review the following resources:
- [Packages and projects](./04-packages-and-projects.md)
- [Vision and Philosophy](https://github.com/WordPress/wordpress-playground/issues/472)
- [Roadmap](https://github.com/WordPress/wordpress-playground/issues/525)
+
+## HTTPS setup
+
+Some Playground features, like multisite, require a local test domain running via HTTPS.
+
+One way to get it set up is with [Laravel Valet](https://laravel.com/docs/10.x/valet).
+
+Once your Valet is installed, run:
+
+```bash
+valet proxy playground.test http://localhost:5400 --secure
+```
+
+Your dev server is now available via https://playground.test.
diff --git a/packages/php-wasm/web/src/lib/register-service-worker.ts b/packages/php-wasm/web/src/lib/register-service-worker.ts
index 98f480b7da..1102fb9a6f 100644
--- a/packages/php-wasm/web/src/lib/register-service-worker.ts
+++ b/packages/php-wasm/web/src/lib/register-service-worker.ts
@@ -17,7 +17,16 @@ export async function registerServiceWorker<
>(phpApi: Client, scope: string, scriptUrl: string) {
const sw = navigator.serviceWorker;
if (!sw) {
- throw new Error('Service workers are not supported in this browser.');
+ if (location.protocol === 'https:') {
+ throw new Error(
+ 'Service workers are not supported in this browser.'
+ );
+ } else {
+ throw new Error(
+ 'WordPress Playground requires service workers which are only supported ' +
+ 'on HTTPS sites. This site does not use HTTPS, please retry on one that does. '
+ );
+ }
}
console.debug(`[window][sw] Registering a Service Worker`);
diff --git a/packages/playground/client/src/index.ts b/packages/playground/client/src/index.ts
index 9b4ecefd0c..88bfb7a694 100644
--- a/packages/playground/client/src/index.ts
+++ b/packages/playground/client/src/index.ts
@@ -33,6 +33,7 @@ export { phpVar, phpVars } from '@php-wasm/util';
import {
Blueprint,
compileBlueprint,
+ defineWpConfigConsts,
OnStepCompleted,
runBlueprintSteps,
} from '@wp-playground/blueprints';
@@ -95,46 +96,100 @@ export async function startPlaygroundWeb({
}),
progressTracker
);
+ await playground.defineConstant('WP_ALLOW_MULTISITE', true);
+ // Deactivate all the plugins
+ const result = await playground.run({
+ code: ` {
+ await defineWpConfigConsts(playground, {
+ consts: {
+ DOMAIN_CURRENT_SITE: 'playground.test',
+ PATH_CURRENT_SITE:
+ new URL(await playground.absoluteUrl).pathname + '/',
+ },
+ });
+ // const response = await playground.run({
+ // code: `tables( 'ms_global' ) as $table => $prefixed_table ) {
- $wpdb->$table = $prefixed_table;
- }
- require_once '/wordpress/wp-admin/includes/upgrade.php';
-
- $result = install_network();
- var_dump($result);
- require_once '/wordpress/wp-admin/includes/upgrade.php';
- $base = "${new URL(await playground.absoluteUrl).pathname}";
- $result = populate_network( 1, "localhost:5400", sanitize_email( "adam@adamziel.com" ), wp_unslash( "My network!" ), $base, $subdomain_install = false );
- var_dump($result);
- `,
- });
- console.log(response.text);
+ // require '/wordpress/wp-admin/includes/network.php';
+ // foreach ( $wpdb->tables( 'ms_global' ) as $table => $prefixed_table ) {
+ // $wpdb->$table = $prefixed_table;
+ // }
+ // require_once '/wordpress/wp-admin/includes/upgrade.php';
+
+ // $result = install_network();
+ // var_dump($result);
+ // require_once '/wordpress/wp-admin/includes/upgrade.php';
+ // $base = "${new URL(await playground.absoluteUrl).pathname}";
+ // $result = populate_network( 1, "localhost:5400", sanitize_email( "adam@adamziel.com" ), wp_unslash( "My network!" ), $base, $subdomain_install = false );
+ // var_dump($result);
+ // `,
+ // });
+ // console.log(response.text);
+
+ await defineWpConfigConsts(playground, {
+ consts: {
+ MULTISITE: true,
+ SUBDOMAIN_INSTALL: false,
+ SITE_ID_CURRENT_SITE: 1,
+ BLOG_ID_CURRENT_SITE: 1,
+ WPSITEURL: 'https://playground.test',
+ WPHOME: 'https://playground.test',
+ },
+ });
+
+ const response2 = await playground.run({
+ code: `
Date: Tue, 23 Jan 2024 14:26:05 +0100
Subject: [PATCH 03/39] Blueprints: Add enableMultisite step
This step enables multisite support in the WordPress installation. It
does not create any sites, but it does create the necessary tables in
the database.
Example Blueprint:
```json
{
"landingPage":"/wp-admin/network.php",
"steps": [
{ "step": "enableMultisite" }
]
}
```
## URL rewriting
This PR also ships a URL rewriting logic in the service worker. This
is to ensure that requests to URLs like `/mysite/wp-admin/` are still
resolved to the `/wp-admin/index.php` file.
Internally, this is done by adding a `x-rewrite-url` header to the
request whenever the URL matches a rewrite rule after an initial 404.
CC @dmsnell
---
.../universal/src/lib/php-request-handler.ts | 19 +-
.../blueprints/public/blueprint-schema.json | 23 +
.../src/lib/steps/enable-multisite.ts | 141 +++++
.../blueprints/src/lib/steps/handlers.ts | 1 +
.../blueprints/src/lib/steps/index.ts | 3 +
.../blueprints/src/lib/steps/run-sql.ts | 2 +
packages/playground/client/src/index.ts | 94 ---
packages/playground/remote/service-worker.ts | 67 ++-
.../playground/wordpress/build/Dockerfile | 32 +-
.../wordpress/src/wordpress/wp-6.4.data | 535 ++++++++++--------
.../wordpress/src/wordpress/wp-6.4.js | 12 +-
11 files changed, 576 insertions(+), 353 deletions(-)
create mode 100644 packages/playground/blueprints/src/lib/steps/enable-multisite.ts
diff --git a/packages/php-wasm/universal/src/lib/php-request-handler.ts b/packages/php-wasm/universal/src/lib/php-request-handler.ts
index 493e0662f2..668ea03a8f 100644
--- a/packages/php-wasm/universal/src/lib/php-request-handler.ts
+++ b/packages/php-wasm/universal/src/lib/php-request-handler.ts
@@ -178,6 +178,7 @@ export class PHPRequestHandler implements RequestHandler {
*/
const release = await this.#semaphore.acquire();
try {
+ this.php.addServerGlobalEntry('REMOTE_ADDR', '127.0.0.1');
this.php.addServerGlobalEntry('DOCUMENT_ROOT', this.#DOCROOT);
this.php.addServerGlobalEntry(
'HTTPS',
@@ -236,7 +237,18 @@ export class PHPRequestHandler implements RequestHandler {
let scriptPath;
try {
- scriptPath = this.#resolvePHPFilePath(requestedUrl.pathname);
+ // Support URL rewriting
+ let requestedPath = requestedUrl.pathname;
+ if (request.headers?.['x-rewrite-url']) {
+ try {
+ requestedPath = new URL(
+ request.headers['x-rewrite-url']
+ ).pathname;
+ } catch (error) {
+ // Ignore
+ }
+ }
+ scriptPath = this.#resolvePHPFilePath(requestedPath);
} catch (error) {
return new PHPResponse(
404,
@@ -291,10 +303,7 @@ export class PHPRequestHandler implements RequestHandler {
if (this.php.fileExists(resolvedFsPath)) {
return resolvedFsPath;
}
- if (!this.php.fileExists(`${this.#DOCROOT}/index.php`)) {
- throw new Error(`File not found: ${resolvedFsPath}`);
- }
- return `${this.#DOCROOT}/index.php`;
+ throw new Error(`File not found: ${resolvedFsPath}`);
}
}
diff --git a/packages/playground/blueprints/public/blueprint-schema.json b/packages/playground/blueprints/public/blueprint-schema.json
index d2c2f18209..5356711c9a 100644
--- a/packages/playground/blueprints/public/blueprint-schema.json
+++ b/packages/playground/blueprints/public/blueprint-schema.json
@@ -515,6 +515,29 @@
},
"required": ["siteUrl", "step"]
},
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "progress": {
+ "type": "object",
+ "properties": {
+ "weight": {
+ "type": "number"
+ },
+ "caption": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ "step": {
+ "type": "string",
+ "const": "enableMultisite"
+ }
+ },
+ "required": ["step"]
+ },
{
"type": "object",
"additionalProperties": false,
diff --git a/packages/playground/blueprints/src/lib/steps/enable-multisite.ts b/packages/playground/blueprints/src/lib/steps/enable-multisite.ts
new file mode 100644
index 0000000000..78b5674e01
--- /dev/null
+++ b/packages/playground/blueprints/src/lib/steps/enable-multisite.ts
@@ -0,0 +1,141 @@
+import { phpVar } from '@php-wasm/util';
+import { StepHandler } from '.';
+import { defineWpConfigConsts } from './define-wp-config-consts';
+import { login } from './login';
+import { request } from './request';
+import { setSiteOptions } from './site-data';
+
+/**
+ * @inheritDoc enableMultisite
+ * @hasRunnableExample
+ * @example
+ *
+ *
+ * {
+ * "step": "enableMultisite",
+ * }
+ *
+ */
+export interface EnableMultisiteStep {
+ step: 'enableMultisite';
+}
+
+/**
+ * Defines constants in a wp-config.php file.
+ *
+ * This step can be called multiple times, and the constants will be merged.
+ *
+ * @param playground The playground client.
+ * @param enableMultisite
+ */
+export const enableMultisite: StepHandler = async (
+ playground
+) => {
+ // Ensure we're logged in
+ await login(playground, {});
+
+ await defineWpConfigConsts(playground, {
+ consts: {
+ WP_ALLOW_MULTISITE: 1,
+ },
+ });
+
+ const url = new URL(await playground.absoluteUrl);
+ const sitePath = url.pathname.replace(/\/$/, '') + '/';
+ const siteUrl = `${url.protocol}//${url.host}${sitePath}`;
+ await setSiteOptions(playground, {
+ options: {
+ siteurl: siteUrl,
+ home: siteUrl,
+ },
+ });
+
+ const docroot = await playground.documentRoot;
+
+ // Deactivate all the plugins as required by the multisite installation.
+ await playground.run({
+ code: `) {
+ return Object.keys(json)
+ .map(
+ (key) =>
+ encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
+ )
+ .join('&');
+}
diff --git a/packages/playground/blueprints/src/lib/steps/handlers.ts b/packages/playground/blueprints/src/lib/steps/handlers.ts
index f5d09afdd2..4e93d5dfd0 100644
--- a/packages/playground/blueprints/src/lib/steps/handlers.ts
+++ b/packages/playground/blueprints/src/lib/steps/handlers.ts
@@ -6,6 +6,7 @@ export { runPHPWithOptions } from './run-php-with-options';
export { runSql } from './run-sql';
export { setPhpIniEntry } from './set-php-ini-entry';
export { request } from './request';
+export { enableMultisite } from './enable-multisite';
export { cp } from './cp';
export { mv } from './mv';
export { rm } from './rm';
diff --git a/packages/playground/blueprints/src/lib/steps/index.ts b/packages/playground/blueprints/src/lib/steps/index.ts
index 17d431cc83..87c9a18723 100644
--- a/packages/playground/blueprints/src/lib/steps/index.ts
+++ b/packages/playground/blueprints/src/lib/steps/index.ts
@@ -28,6 +28,7 @@ import { ActivateThemeStep } from './activate-theme';
import { UnzipStep } from './unzip';
import { ImportWordPressFilesStep } from './import-wordpress-files';
import { ImportFileStep } from './import-file';
+import { EnableMultisiteStep } from './enable-multisite';
export type Step = GenericStep;
export type StepDefinition = Step & {
@@ -50,6 +51,7 @@ export type GenericStep =
| CpStep
| DefineWpConfigConstsStep
| DefineSiteUrlStep
+ | EnableMultisiteStep
| ImportFileStep
| ImportWordPressFilesStep
| InstallPluginStep
@@ -77,6 +79,7 @@ export type {
CpStep,
DefineWpConfigConstsStep,
DefineSiteUrlStep,
+ EnableMultisiteStep,
ImportFileStep,
ImportWordPressFilesStep,
InstallPluginStep,
diff --git a/packages/playground/blueprints/src/lib/steps/run-sql.ts b/packages/playground/blueprints/src/lib/steps/run-sql.ts
index 94956d591f..727661fc0c 100644
--- a/packages/playground/blueprints/src/lib/steps/run-sql.ts
+++ b/packages/playground/blueprints/src/lib/steps/run-sql.ts
@@ -75,6 +75,8 @@ export const runSql: StepHandler> = async (
}
`,
});
+ console.log(runPhp.text);
+ console.log(runPhp.errors);
await rm(playground, { path: sqlFilename });
diff --git a/packages/playground/client/src/index.ts b/packages/playground/client/src/index.ts
index 88bfb7a694..ebae97b29c 100644
--- a/packages/playground/client/src/index.ts
+++ b/packages/playground/client/src/index.ts
@@ -33,7 +33,6 @@ export { phpVar, phpVars } from '@php-wasm/util';
import {
Blueprint,
compileBlueprint,
- defineWpConfigConsts,
OnStepCompleted,
runBlueprintSteps,
} from '@wp-playground/blueprints';
@@ -96,100 +95,7 @@ export async function startPlaygroundWeb({
}),
progressTracker
);
- await playground.defineConstant('WP_ALLOW_MULTISITE', true);
- // Deactivate all the plugins
- const result = await playground.run({
- code: ` {
- await defineWpConfigConsts(playground, {
- consts: {
- DOMAIN_CURRENT_SITE: 'playground.test',
- PATH_CURRENT_SITE:
- new URL(await playground.absoluteUrl).pathname + '/',
- },
- });
- // const response = await playground.run({
- // code: `tables( 'ms_global' ) as $table => $prefixed_table ) {
- // $wpdb->$table = $prefixed_table;
- // }
- // require_once '/wordpress/wp-admin/includes/upgrade.php';
-
- // $result = install_network();
- // var_dump($result);
- // require_once '/wordpress/wp-admin/includes/upgrade.php';
- // $base = "${new URL(await playground.absoluteUrl).pathname}";
- // $result = populate_network( 1, "localhost:5400", sanitize_email( "adam@adamziel.com" ), wp_unslash( "My network!" ), $base, $subdomain_install = false );
- // var_dump($result);
- // `,
- // });
- // console.log(response.text);
-
- await defineWpConfigConsts(playground, {
- consts: {
- MULTISITE: true,
- SUBDOMAIN_INSTALL: false,
- SITE_ID_CURRENT_SITE: 1,
- BLOG_ID_CURRENT_SITE: 1,
- WPSITEURL: 'https://playground.test',
- WPHOME: 'https://playground.test',
- },
- });
-
- const response2 = await playground.run({
- code: ` = {};
+ event.request.headers.forEach((value, key) => {
+ existingHeaders[key] = value;
+ });
+
+ rewrittenUrlString = setURLScope(
+ rewrittenUrlObject,
+ scope!
+ ).toString();
+ workerResponse = await convertFetchEventToPHPRequest(
+ new FetchEvent(event.type, {
+ ...event,
+ request: await cloneRequest(event.request, {
+ headers: {
+ ...event.request.headers,
+ 'x-rewrite-url': rewrittenUrlString,
+ },
+ }),
+ })
+ );
+ }
+ }
+
if (
workerResponse.status === 404 &&
workerResponse.headers.get('x-file-type') === 'static'
@@ -52,7 +107,8 @@ initializeServiceWorker({
// the from the static assets directory at the remote server.
const request = await rewriteRequest(
event.request,
- staticAssetsDirectory
+ staticAssetsDirectory,
+ rewrittenUrlString
);
return fetch(request).catch((e) => {
if (e?.name === 'TypeError') {
@@ -209,9 +265,10 @@ type WPModuleDetails = {
const scopeToWpModule: Record = {};
async function rewriteRequest(
request: Request,
- staticAssetsDirectory: string
+ staticAssetsDirectory: string,
+ rewriteUrl?: string
): Promise {
- const requestedUrl = new URL(request.url);
+ const requestedUrl = new URL(rewriteUrl || request.url);
const resolvedUrl = removeURLScope(requestedUrl);
if (
diff --git a/packages/playground/wordpress/build/Dockerfile b/packages/playground/wordpress/build/Dockerfile
index 8a60488942..d4c12cfa10 100644
--- a/packages/playground/wordpress/build/Dockerfile
+++ b/packages/playground/wordpress/build/Dockerfile
@@ -19,16 +19,24 @@ RUN wget -O wp.zip $WP_ZIP_URL && \
unzip -q wp.zip && \
rm wp.zip
-# Enable the SQLite support:
+# === Create the mu-plugins directory ===
+RUN mkdir wordpress/wp-content/mu-plugins
+
+# Enable the SQLite support as a mu-plugin to:
+# * Ensure it won't accidentally be disabled by the user
+# * Prevent it from blocking a multisite setup where disabling all the plugins is required
# https://github.com/WordPress/sqlite-database-integration
RUN git clone https://github.com/WordPress/sqlite-database-integration.git \
- wordpress/wp-content/plugins/sqlite-database-integration \
+ wordpress/wp-content/mu-plugins/sqlite-database-integration \
--branch main \
--single-branch \
--depth 1 && \
- rm -rf wordpress/wp-content/plugins/sqlite-database-integration/.git && \
+ rm -rf wordpress/wp-content/mu-plugins/sqlite-database-integration/.git && \
# Required by the SQLite integration plugin:
- cp wordpress/wp-content/plugins/sqlite-database-integration/db.copy wordpress/wp-content/db.php && \
+ cat wordpress/wp-content/mu-plugins/sqlite-database-integration/db.copy \
+ | sed "s#'{SQLITE_IMPLEMENTATION_FOLDER_PATH}'#__DIR__.'/mu-plugins/sqlite-database-integration/'#g" \
+ | sed "s#'{SQLITE_PLUGIN}'#__DIR__.'/mu-plugins/sqlite-database-integration/load.php'#g" \
+ > wordpress/wp-content/db.php && \
cp wordpress/wp-config-sample.php wordpress/wp-config.php
# Remove the akismet plugin as it's not likely Playground sites will
@@ -44,6 +52,9 @@ RUN cp -r wordpress wordpress-static && \
# Remove all empty directories
find . -type d -empty -delete
+# Remove the sqlite database integration from the static files
+RUN rm -rf wordpress-static/wp-content/mu-plugins
+
# Move the static files to the final output directory
RUN mkdir /root/output/$OUT_FILENAME
RUN mv wordpress-static/* /root/output/$OUT_FILENAME/
@@ -118,9 +129,6 @@ RUN ls -la && \
exit 'WordPress installation failed'; \
fi
-# === Create the mu-plugins directory ===
-RUN mkdir wordpress/wp-content/mu-plugins
-
# === Install WP-CLI ===
RUN curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar && \
chmod +x wp-cli.phar
@@ -149,11 +157,11 @@ RUN cd wordpress && \
# treated as comments and removed by the whitespace stripping.
RUN cd wordpress && \
for phpfile in $(\
- find ./ -type f -name '*.php' \
- -not -path '*wordpress-importer*' \
- -not -path '*wp-content*' \
- # wp-cli expects an unminified wp-config.php
- -not -path '*wp-config.php' \
+ find ./ -type f -name '*.php' \
+ -not -path '*wordpress-importer*' \
+ -not -path '*wp-content*' \
+ # wp-cli expects an unminified wp-config.php
+ -not -path '*wp-config.php' \
); do \
# Remove whitespace from PHP files
php -w $phpfile > $phpfile.small && \
diff --git a/packages/playground/wordpress/src/wordpress/wp-6.4.data b/packages/playground/wordpress/src/wordpress/wp-6.4.data
index 41cef97249..5e231d7e3a 100644
--- a/packages/playground/wordpress/src/wordpress/wp-6.4.data
+++ b/packages/playground/wordpress/src/wordpress/wp-6.4.data
@@ -13960,7 +13960,7 @@ i
��� � K � m� .
�T �s<�L�~�7�
(�p@�V!������;_#����|N����<c�L1�i!e�|���P�-�nC
��1Rp���
�
�
�
�
<
b
�
'��Q6�j
��;����\"y��� "7wp_postswp_posts__post_authorz"7wp_postswp_posts__post_parenty'Awp_postswp_posts__type_status_datex 3wp_postswp_posts__post_namew'wp_postscomment_countv)wp_postspost_mime_typeuwp_postspost_typet!wp_postsmenu_orderswp_postsguidr#wp_postspost_parentq"7wp_postspost_content_filteredp/wp_postspost_modified_gmto'wp_postspost_modifiednwp_postspingedmwp_poststo_pinglwp_postspost_namek'wp_postspost_passwordj#wp_postsping_statusi)wp_postscomment_statush#wp_postspost_statusg%wp_postspost_excerptf!wp_postspost_titlee%wp_postspost_contentd'wp_postspost_date_gmtcwp_postspost_dateb#wp_postspost_authorawp_postsID`%#7wp_postmetawp_postmeta__meta_key_$#5wp_postmetawp_postmeta__post_id^#!wp_postmetameta_value]#wp_postmetameta_key\#wp_postmetapost_id[#wp_postmetameta_idZ#!5wp_optionswp_options__autoloadY&!;wp_optionswp_options__option_nameX!wp_optionsautoloadW!%wp_optionsoption_valueV!#wp_optionsoption_nameU!wp_optionsoption_idT#9wp_linkswp_links__link_visibleSwp_linkslink_rssR!wp_linkslink_notesQwp_linkslink_relP%wp_linkslink_updatedO#wp_linkslink_ratingN!wp_linkslink_ownerM%wp_linkslink_visibleL-wp_linkslink_descriptionK#wp_linkslink_targetJ!wp_linkslink_imageIwp_linkslink_nameHwp_linkslink_urlGwp_linkslink_idF1#Owp_commentswp_comments__comment_author_emailE+#Cwp_commentswp_comments__comment_parentD-#Gwp_commentswp_comments__comment_date_gmtC6#Ywp_commentswp_comments__comment_approved_date_gmtB,#Ewp_commentswp_comments__comment_post_IDA#wp_commentsuser_id@#)wp_commentscomment_parent?#%wp_commentscomment_type>#'wp_commentscomment_agent= #-wp_commentscomment_approved<#'wp_commentscomment_karma;#+wp_commentscomment_content: #-wp_commentscomment_date_gmt9#%wp_commentscomment_date8!#/wp_commentscomment_author_IP7"#1wp_commentscomment_author_url6$#5wp_commentscomment_author_email5#)wp_commentscomment_author4#+wp_commentscomment_post_ID3#!wp_commentscomment_ID2+)=wp_commentmetawp_commentmeta__meta_key1-)Awp_commentmetawp_commentmeta__comment_id0)!wp_commentmetameta_value/)wp_commentmetameta_key.)!wp_commentmetacomment_id-)wp_commentmetameta_id,A7[wp_term_relationshipswp_term_relationships__term_taxonomy_id+$7!wp_term_relationshipsterm_order**7-wp_term_relationshipsterm_taxonomy_id)#7wp_term_relationshipsobject_id(/-Awp_term_taxonomywp_term_taxonomy__taxonomy'7-Qwp_term_taxonomywp_term_taxonomy__term_id_taxonomy&-wp_term_taxonomycount%-wp_term_taxonomyparent$ -#wp_term_taxonomydescription#-wp_term_taxonomytaxonomy"-wp_term_taxonomyterm_id!%--wp_term_taxonomyterm_taxonomy_id )wp_termswp_terms__name)wp_termswp_terms__slug!wp_termsterm_groupwp_termsslugwp_termsnamewp_termsterm_id%#7wp_termmetawp_termmeta__meta_key$#5wp_termmetawp_termmeta__term_id#!wp_termmetameta_value#wp_termmetameta_key#wp_termmetaterm_id#wp_termmetameta_id%#7wp_usermetawp_usermeta__meta_key$#5wp_usermetawp_usermeta__user_id#!wp_usermetameta_value#wp_usermetameta_key#wp_usermetauser_id#wp_usermetaumeta_id!5wp_userswp_users__user_email
$;wp_userswp_users__user_nicename%=wp_userswp_users__user_login_key%wp_usersdisplay_name
-#wp_usersuser_status 3wp_usersuser_activation_key+wp_usersuser_registeredwp_usersuser_url!wp_usersuser_email'wp_usersuser_nicenamewp_usersuser_pass!wp_usersuser_login wp_usersID
� � w Q373
admin$P$BCiAYjk6BMbr1oN.NtYAo554oojgqX1adminadmin@localhost.comhttp://127.0.0.1:80002024-01-19 10:43:33admin
� t �������t #wp_postmetawp_posts# wp_comments
- wp_term_taxonomy wp_terms#wp_usermeta wp_users!wp_options|
+#wp_usersuser_status 3wp_usersuser_activation_key+wp_usersuser_registeredwp_usersuser_url!wp_usersuser_email'wp_usersuser_nicenamewp_usersuser_pass!wp_usersuser_login wp_usersID
� � w Q373
admin$P$BKt8Ncb5IcKpSKEgdxAi831q2nbMrh.adminadmin@localhost.comhttp://127.0.0.1:80002024-01-23 13:09:06admin
� t �������t #wp_postmetawp_posts# wp_comments
- wp_term_taxonomy wp_terms#wp_usermeta wp_users!wp_options|
� � admin
� � admin
� � 3 admin@localhost.com
� } ������gPA"}��� 3 +Kwp_capabilitiesa:1:{s:13:"administrator";b:1;} 7
dismissed_wp_pointers 1show_welcome_panel1
'wp_user_level10
locale
@@ -14053,12 +14053,12 @@ CREATE INDEX "wp_usermeta__user_id" ON "wp_usermeta" ("user_id")
"link_notes" text NOT NULL COLLATE NOCASE,
"link_rss" text NOT NULL DEFAULT '' COLLATE NOCASE)
-
� � �W 7;9
33�9
A WordPress Commenterwapuu@wordpress.examplehttps://wordpress.org/2024-01-19 10:43:332024-01-19 10:43:33Hi, this is a comment.
+
� � �W 7;9
33�9
A WordPress Commenterwapuu@wordpress.examplehttps://wordpress.org/2024-01-23 13:09:062024-01-23 13:09:06Hi, this is a comment.
To get started with moderating, editing, and deleting comments, please visit the Comments screen in the dashboard.
Commenter avatars come from Gravatar.1comment
� �
- � � 3 12024-01-19 10:43:33
- � � 3 2024-01-19 10:43:33
+ � � 3 12024-01-23 13:09:06
+ � � 3 2024-01-23 13:09:06
� �
� � ; wapuu@wordpress.example
� 6�� 4e 3V
@@ -14087,7 +14087,7 @@ S
7
�
k
- � � � Y ���g6��N���Z.��O���X6���|Q1����V/���i> � � &^#5wp_postmetawp_postmeta__post_idKEY!]#!wp_postmetameta_valuelongtext#\#%wp_postmetameta_keyvarchar(255))[#3wp_postmetapost_idbigint(20) unsigned)Z#3wp_postmetameta_idbigint(20) unsigned%Y!5wp_optionswp_options__autoloadKEY+X!;wp_optionswp_options__option_nameUNIQUE!W!#wp_optionsautoloadvarchar(20)"V!%wp_optionsoption_valuelongtext%U!#%wp_optionsoption_namevarchar(191)*T!3wp_optionsoption_idbigint(20) unsigned%S9wp_linkswp_links__link_visibleKEY R%wp_linkslink_rssvarchar(255) Q!!wp_linkslink_notesmediumtext P%wp_linkslink_relvarchar(255) O%wp_linkslink_updateddatetimeN#wp_linkslink_ratingint(11))M!3wp_linkslink_ownerbigint(20) unsigned#L%#wp_linkslink_visiblevarchar(20)(K-%wp_linkslink_descriptionvarchar(255)"J##wp_linkslink_targetvarchar(25)"I!%wp_linkslink_imagevarchar(255)!H%wp_linkslink_namevarchar(255) G%wp_linkslink_urlvarchar(255)&F3wp_linkslink_idbigint(20) unsigned3E#Owp_commentswp_comments__comment_author_emailKEY-D#Cwp_commentswp_comments__comment_parentKEY/C#Gwp_commentswp_comments__comment_date_gmtKEY8B#Ywp_commentswp_comments__comment_approved_date_gmtKEY.A#Ewp_commentswp_comments__comment_post_IDKEY)@#3wp_commentsuser_idbigint(20) unsigned0?#)3wp_commentscomment_parentbigint(20) unsigned&>#%#wp_commentscomment_typevarchar(20)(=#'%wp_commentscomment_agentvarchar(255)*<#-#wp_commentscomment_approvedvarchar(20)#;#'wp_commentscomment_karmaint(11)":#+wp_commentscomment_contenttext'9#-wp_commentscomment_date_gmtdatetime#8#%wp_commentscomment_datedatetime,7#/%wp_commentscomment_author_IPvarchar(100)-6#1%wp_commentscomment_author_urlvarchar(200)/5#5%wp_commentscomment_author_emailvarchar(100)%4#)wp_commentscomment_authortinytext13#+3wp_commentscomment_post_IDbigint(20) unsigned,2#!3wp_commentscomment_IDbigint(20) unsigned-1)=wp_commentmetawp_commentmeta__meta_keyKEY/0)Awp_commentmetawp_commentmeta__comment_idKEY$/)!wp_commentmetameta_valuelongtext&.)%wp_commentmetameta_keyvarchar(255)/-)!3wp_commentmetacomment_idbigint(20) unsigned,,)3wp_commentmetameta_idbigint(20) unsignedC+7[wp_term_relationshipswp_term_relationships__term_taxonomy_idKEY**7!wp_term_relationshipsterm_orderint(11)<)7-3wp_term_relationshipsterm_taxonomy_idbigint(20) unsigned5(73wp_term_relationshipsobject_idbigint(20) unsigned1'-Awp_term_taxonomywp_term_taxonomy__taxonomyKEY<&-Qwp_term_taxonomywp_term_taxonomy__term_id_taxonomyUNIQUE#%-!wp_term_taxonomycountbigint(20)-$-3wp_term_taxonomyparentbigint(20) unsigned'#-#wp_term_taxonomydescriptionlongtext'"-#wp_term_taxonomytaxonomyvarchar(32).!-3wp_term_taxonomyterm_idbigint(20) unsigned7 --3wp_term_taxonomyterm_taxonomy_idbigint(20) unsigned)wp_termswp_terms__nameKEY)wp_termswp_terms__slugKEY !!wp_termsterm_groupbigint(10)%wp_termsslugvarchar(200)%wp_termsnamevarchar(200)&3wp_termsterm_idbigint(20) unsigned'#7wp_termmetawp_termmeta__meta_keyKEYwp_termmetawp_termmeta__term_idKEY!#!wp_termmetameta_valuelongtext##%wp_termmetameta_keyvarchar(255))#3wp_termmetaterm_idbigint(20) unsigned)#3wp_termmetameta_idbigint(20) unsigned'#7wp_usermetawp_usermeta__meta_keyKEYwp_usermetawp_usermeta__user_idKEY!#!wp_usermetameta_valuelongtext##%wp_usermetameta_keyvarchar(255))#3wp_usermetauser_idbigint(20) unsigned*#3wp_usermetaumeta_idbigint(20) unsigned#
5wp_userswp_users__user_emailKEY&;wp_userswp_users__user_nicenameKEY'=wp_userswp_users__user_login_keyKEY$
-%%wp_usersdisplay_namevarchar(250) #wp_usersuser_statusint(11)+3%wp_usersuser_activation_keyvarchar(255)#+wp_usersuser_registereddatetime %wp_usersuser_urlvarchar(100)"!%wp_usersuser_emailvarchar(100)$'#wp_usersuser_nicenamevarchar(50)!%wp_usersuser_passvarchar(255)!!#wp_usersuser_loginvarchar(60)!3wp_usersIDbigint(20) unsigned
���iF$���{T1
�
�
�
_
A
"
���d> $z7wp_postswp_posts__post_authorKEY$y7wp_postswp_posts__post_parentKEY)xAwp_postswp_posts__type_status_dateKEY"w3wp_postswp_posts__post_nameKEY#v'!wp_postscomment_countbigint(20)&u)%wp_postspost_mime_typevarchar(100) t#wp_postspost_typevarchar(20)s!wp_postsmenu_orderint(11)r%wp_postsguidvarchar(255)*q#3wp_postspost_parentbigint(20) unsigned)p7wp_postspost_content_filteredlongtext%o/wp_postspost_modified_gmtdatetime!n'wp_postspost_modifieddatetimemwp_postspingedtextlwp_poststo_pingtext!k%wp_postspost_namevarchar(200)%j'%wp_postspost_passwordvarchar(255)"i##wp_postsping_statusvarchar(20)%h)#wp_postscomment_statusvarchar(20)"g##wp_postspost_statusvarchar(20)f%wp_postspost_excerpttexte!wp_postspost_titletext d%wp_postspost_contentlongtext!c'wp_postspost_date_gmtdatetimebwp_postspost_datedatetime*a#3wp_postspost_authorbigint(20) unsigned!`3wp_postsIDbigint(20) unsigned'_#7wp_postmetawp_postmeta__meta_keyKEY
� 8 �( 33�u)
)
33
M
2024-01-19 10:43:332024-01-19 10:43:33Who we are
Suggested text: Our website address is: http://127.0.0.1:8000.
Comments
Suggested text: When visitors leave comments on the site we collect the data shown in the comments form, and also the visitor’s IP address and browser user agent string to help spam detection.
An anonymized string created from your email address (also called a hash) may be provided to the Gravatar service to see if you are using it. The Gravatar service privacy policy is available here: https://automattic.com/privacy/. After approval of your comment, your profile picture is visible to the public in the context of your comment.
Media
Suggested text: If you upload images to the website, you should avoid uploading images with embedded location data (EXIF GPS) included. Visitors to the website can download a 5� 33�M#
#
33
M
2024-01-19 10:43:332024-01-19 10:43:33
+%%wp_usersdisplay_namevarchar(250) #wp_usersuser_statusint(11)+3%wp_usersuser_activation_keyvarchar(255)#+wp_usersuser_registereddatetime %wp_usersuser_urlvarchar(100)"!%wp_usersuser_emailvarchar(100)$'#wp_usersuser_nicenamevarchar(50)!%wp_usersuser_passvarchar(255)!!#wp_usersuser_loginvarchar(60)!3wp_usersIDbigint(20) unsigned
���iF$���{T1
�
�
�
_
A
"
���d> $z7wp_postswp_posts__post_authorKEY$y7wp_postswp_posts__post_parentKEY)xAwp_postswp_posts__type_status_dateKEY"w3wp_postswp_posts__post_nameKEY#v'!wp_postscomment_countbigint(20)&u)%wp_postspost_mime_typevarchar(100) t#wp_postspost_typevarchar(20)s!wp_postsmenu_orderint(11)r%wp_postsguidvarchar(255)*q#3wp_postspost_parentbigint(20) unsigned)p7wp_postspost_content_filteredlongtext%o/wp_postspost_modified_gmtdatetime!n'wp_postspost_modifieddatetimemwp_postspingedtextlwp_poststo_pingtext!k%wp_postspost_namevarchar(200)%j'%wp_postspost_passwordvarchar(255)"i##wp_postsping_statusvarchar(20)%h)#wp_postscomment_statusvarchar(20)"g##wp_postspost_statusvarchar(20)f%wp_postspost_excerpttexte!wp_postspost_titletext d%wp_postspost_contentlongtext!c'wp_postspost_date_gmtdatetimebwp_postspost_datedatetime*a#3wp_postspost_authorbigint(20) unsigned!`3wp_postsIDbigint(20) unsigned'_#7wp_postmetawp_postmeta__meta_keyKEY
� 8 �( 33�u)
)
33
M
2024-01-23 13:09:062024-01-23 13:09:06
Who we are
Suggested text: Our website address is: http://127.0.0.1:8000.
Comments
Suggested text: When visitors leave comments on the site we collect the data shown in the comments form, and also the visitor’s IP address and browser user agent string to help spam detection.
An anonymized string created from your email address (also called a hash) may be provided to the Gravatar service to see if you are using it. The Gravatar service privacy policy is available here: https://automattic.com/privacy/. After approval of your comment, your profile picture is visible to the public in the context of your comment.
Media
Suggested text: If you upload images to the website, you should avoid uploading images with embedded location data (EXIF GPS) included. Visitors to the website can download a 5� 33�M#
#
33
M
2024-01-23 13:09:062024-01-23 13:09:06
This is an example page. It's different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:
@@ -14105,9 +14105,9 @@ k
As a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!
-Sample Pagepublishclosedopensample-page2024-01-19 10:43:332024-01-19 10:43:33http://127.0.0.1:8000/?page_id=2page�2 33�%
#
33
A
2024-01-19 10:43:332024-01-19 10:43:33
+Sample Pagepublishclosedopensample-page2024-01-23 13:09:062024-01-23 13:09:06http://127.0.0.1:8000/?page_id=2page�2 33�%
#
33
A
2024-01-23 13:09:062024-01-23 13:09:06
Welcome to WordPress. This is your first post. Edit or delete it, then start writing!
-Hello world!publishopenopenhello-world2024-01-19 10:43:332024-01-19 10:43:33http://127.0.0.1:8000/?p=1post
� �}
��6��@�9� l,7�indexwp_posts__post_authorwp_posts2CREATE INDEX "wp_posts__post_author" ON "wp_posts" ("post_author")l+7�indexwp_posts__post_parentwp_posts1CREATE INDEX "wp_posts__post_parent" ON "wp_posts" ("post_parent")�*A�[indexwp_posts__type_status_datewp_posts0CREATE INDEX "wp_posts__type_status_date" ON "wp_posts" ("post_type", "post_status", "post_date", "ID")f)3� indexwp_posts__post_namewp_posts/CREATE INDEX "wp_posts__post_name" ON "wp_posts" ("post_name")�(�tablewp_postswp_posts-CREATE TABLE "wp_posts" (
+Hello world!publishopenopenhello-world2024-01-23 13:09:062024-01-23 13:09:06http://127.0.0.1:8000/?p=1post
� �}
��6��@�9� l,7�indexwp_posts__post_authorwp_posts2CREATE INDEX "wp_posts__post_author" ON "wp_posts" ("post_author")l+7�indexwp_posts__post_parentwp_posts1CREATE INDEX "wp_posts__post_parent" ON "wp_posts" ("post_parent")�*A�[indexwp_posts__type_status_datewp_posts0CREATE INDEX "wp_posts__type_status_date" ON "wp_posts" ("post_type", "post_status", "post_date", "ID")f)3� indexwp_posts__post_namewp_posts/CREATE INDEX "wp_posts__post_name" ON "wp_posts" ("post_name")�(�tablewp_postswp_posts-CREATE TABLE "wp_posts" (
"ID" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
"post_author" integer NOT NULL DEFAULT '0',
"post_date" text NOT NULL DEFAULT '0000-00-00 00:00:00' COLLATE NOCASE,
@@ -14140,12 +14140,12 @@ k
"option_value" text NOT NULL COLLATE NOCASE,
"autoload" text NOT NULL DEFAULT 'yes' COLLATE NOCASE)o!9�indexwp_links__link_visiblewp_links$CREATE INDEX "wp_links__link_visible" ON "wp_links" ("link_visible")
� ��� )privacy-policy#sample-page# hello-world
- � ��� $3pagedraft2024-01-19 10:43:33&3pagepublish2024-01-19 10:43:33$3 postpublish2024-01-19 10:43:33
+ � ��� $3pagedraft2024-01-23 13:09:06&3pagepublish2024-01-23 13:09:06$3 postpublish2024-01-23 13:09:06
� ���
� ���
# V2 ���x[3�����Y.
�
�
�
�
q
W
<
"�����tYA2����tR.����zeO/����fL2�����Z7�����mL1�����pF2���wQ#����^== I 3ipermalink_structure/index.php/%year%/%monthnum%/%day%/%postname%/yes=1 V site_icon0yes(U Kfinished_splitting_shared_terms1yesT 5link_manager_enabled0yesS 3default_post_format0yesR 'page_on_front0yesQ )page_for_posts0yesP +
timezone_stringyesO /uninstall_pluginsa:0:{}noN !widget_rssa:0:{}yesM #widget_texta:0:{}yesL /widget_categoriesa:0:{}yesK %sticky_postsa:0:{}yesJ 'comment_orderascyes#I 7default_comments_pagenewestyesH /comments_per_page50yesG 'page_comments0yesF 7thread_comments_depth5yesE +thread_comments1yes!D ;close_comments_days_old14yes%C Eclose_comments_for_old_posts0yesB 3
image_default_alignyesA 1
image_default_sizeyes#@ ;image_default_link_typenoneyes? %large_size_h1024yes> %large_size_w1024yes= )avatar_defaultmysteryyes< 'medium_size_h300yes; 'medium_size_w300yes: )thumbnail_crop1yes9 -thumbnail_size_h150yes8 -thumbnail_size_w150yes7 +
upload_url_pathyes6 'avatar_ratingGyes5 %show_avatars1yes4
tag_baseyes3 'show_on_frontpostsyes2 7default_link_category2yes1 #blog_public1yes0 #
upload_pathyes&/ Guploads_use_yearmonth_folders1yes. !db_version56657yes- %!default_rolesubscriberyes, 'use_trackback0yes+ html_typetext/htmlyes* 5comment_registration0yes") !-stylesheettwentytwentyfouryes ( -templatetwentytwentyfouryes' +
recently_editedno& 9default_email_category1yes% !gmt_offset0yes$ /comment_max_links2yes,# !Aping_siteshttp://rpc.pingomatic.com/yes" '
category_baseyes� +
moderation_keysno %blog_charsetUTF-8yes hack_file0yes � R! )�active_pluginsa:1:{i:0;s:41:"wordpress-importer/wordpress-importer.php";}yes '
rewrite_rulesyes 3
permalink_structureyes /moderation_notify1yes 1comment_moderation0yes- ?%links_updated_date_formatF j, Y g:i ayes #time_formatg:i ayes #date_formatF j, Yyes )posts_per_page10yes 7default_pingback_flag1yes 3default_ping_statusopenyes" 9default_comment_statusopenyes -default_category1yes +mailserver_port110yes +mailserver_passpasswordyes) -/mailserver_loginlogin@example.comyes& )-mailserver_urlmail.example.comyes
+rss_use_excerpt0yes 'posts_per_rss10yes +comments_notify1yes
- 1require_name_email1yes #use_smilies1yes +use_balanceTags0yes 'start_of_week1yes& #3admin_emailadmin@localhost.comyes 1users_can_register0yes +
blogdescriptionyes$ 5blognameMy WordPress Websiteyes! 7homehttp://127.0.0.1:8000yes$ 7siteurlhttp://127.0.0.1:8000yes
� �lG ����g@���� d 1initial_db_version56657yes$c Cwp_attachment_pages_enabled0yes*b Ewp_force_deactivated_pluginsa:0:{}yes%a 9auto_update_core_majorenabledyes%` 9auto_update_core_minorenabledyes#_ 5auto_update_core_devenabledyes,^ Kauto_plugin_theme_update_emailsa:0:{}no$] Ccomment_previously_approved1yes\ +
disallowed_keysno&[ 5!admin_email_lifespan1721213013yes%Z Eshow_comments_cookies_opt_in1yes#Y Awp_page_for_privacy_policy3yesX 3medium_large_size_h0yesW 3medium_large_size_w768yes�Se '�wp_user_rolesa:5:{s:13:"administrator";a:2:{s:4:"name";s:13:"Administrator";s:12:"capabilities";a:61:{s:13:"switch_themes";b:1;s:11:"edit_themes";b:1;s:16:"activate_plugins";b:1;s:12:"edit_plugins";b:1;s:10:"edit_users";b:1;s:10:"edit_files";b:1;s:14:"manage_options";b:1;s:17:"moderate_comments";b:1;s:17:"manage_categories";b:1;s:12:"manage_links";b:1;s:12:"upload_files";b:1;s:6:"import";b:1;s:15:"unfiltered_html";b:1;s:10:"edit_posts";b:1;s:17:"edit_others_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:10:"edit_pages";b:1;s:4:"read";b:1;s:8:"level_10";b:1;s:7:"level_9";b:1;s:7:"level_8";b:1;s:7:"level_7";b:1;s:7:"level_6";b:1;s:7:"level_5";b:1;s:7:"level_4";b:1;s:7:"level_3";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:17:"edit_others_pages";b:1;s:20:"edit_published_pages";b:1;s:13:"publish_pages";b:1;s:12:"delete_pages";b:1;s:19:"delete_others_pages";b:1;s:22:"delete_published_pages";b:1;s:12:"delete_posts";b:1;s:19:"delete_others_posts";b:1;s:22:"delete_published_posts";b:1;s:20:"delete_private_posts";b:1;s:18:"edit_private_posts";b:1;s:18:"read_private_posts";b:1;s:20:"delete_private_pages";b:1;s:18:"edit_private_pages";b:1;s:18:"read_private_pages";b:1;s:12:"delete_users";b:1;s:12:"create_users";b:1;s:17:"unfiltered_upload";b:1;s:14:"edit_dashboard";b:1;s:14:"update_plugins";b:1;s:14:"delete_plugins";b:1;s:15:"install_plugins";b:1;s:13:"update_themes";b:1;s:14:"install_themes";b:1;s:11:"update_core";b:1;s:10:"list_users";b:1;s:12:"remove_users";b:1;s:13:"promote_users";b:1;s:18:"edit_theme_options";b:1;s:13:"delete_themes";b:1;s:6:"export";b:1;}}s:6:"editor";a:2:{s:4:"name";s:6:"Editor";s:12:"capabilities";a:34:{s:17:"moderate_comments";b:1;s:17:"manage_categories";b:1;s:12:"manage_links";b:1;s:12:"upload_files";b:1;s:15:"unfiltered_html";b:1;s:10:"edit_posts";b:1;s:17:"edit_others_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:10:"edit_pages";b:1;s:4:"read";b:1;s:7:"level_7";b:1;s:7:"level_6";b:1;s:7:"level_5";b:1;s:7:"level_4";b:1;s:7:"level_3";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:17:"edit_others_pages";b:1;s:20:"edit_published_pages";b:1;s:13:"publish_pages";b:1;s:12:"delete_pages";b:1;s:19:"delete_others_pages";b:1;s:22:"delete_published_pages";b:1;s:12:"delete_posts";b:1;s:19:"delete_others_posts";b:1;s:22:"delete_published_posts";b:1;s:20:"delete_private_posts";b:1;s:18:"edit_private_posts";b:1;s:18:"read_private_posts";b:1;s:20:"delete_private_pages";b:1;s:18:"edit_private_pages";b:1;s:18:"read_private_pages";b:1;}}s:6:"author";a:2:{s:4:"name";s:6:"Author";s:12:"capabilities";a:10:{s:12:"upload_files";b:1;s:10:"edit_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:4:"read";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:12:"delete_posts";b:1;s:22:"delete_published_posts";b:1;}}s:11:"contributor";a:2:{s:4:"name";s:11:"Contributor";s:12:"capabilities";a:5:{s:10:"edit_posts";b:1;s:4:"read";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:12:"delete_posts";b:1;}}s:10:"subscriber";a:2:{s:4:"name";s:10:"Subscriber";s:12:"capabilities";a:2:{s:4:"read";b:1;s:7:"level_0";b:1;}}}yes nd extract any location data from images on the website.
Cookies
Suggested text: If you leave a comment on our site you may opt-in to saving your name, email address and website in cookies. These are for your convenience so that you do not have to fill in your details again when you leave another comment. These cookies will last for one year.
If you visit our login page, we will set a temporary cookie to determine if your browser accepts cookies. This cookie contains no personal data and is discarded when you close your browser.
When you log in, we will also set up several cookies to save your login information and your screen display choices. Login cookies last for two days, and screen options cookies last for a year. If you select "Remember Me", your login will persist for two weeks. If you log out of your account, the login cookies will be removed.
If you edit or publish an article, an additional cookie will be saved in your browser. This cookie includes no personal data and simply indicates the post ID of the article you just edited. It expires after 1 day.
Embedded content from other websites
Suggested text: Articles on this site may include embedded content (e.g. videos, images, articles, etc.). Embedded content from other websites behaves in the exact same way as if the visitor has visited the other website.
These websites may collect data about you, use cookies, embed additional third-party tracking, and monitor your interaction with that embedded content, including tracking your interaction with the embedded content if you have an account and are logged in to that website.
Who we share your data with
Suggested text: If you request a password reset, your IP address will be included in the reset email.
How long we retain your data
Suggested text: If you leave a comment, the comment and its metadata are retained indefinitely. This is so we can recognize and approve any follow-up comments automatically instead of holding them in a moderation queue.
For users that register on our website (if any), we also store the personal information they provide in their user profile. All users can see, edit, or delete their personal information at any time (except they cannot change their username). Website administrators can also see and edit that information.
What rights you have over your data
Suggested text: If you have an account on this site, or have left comments, you can request to receive an exported file of the personal data we hold about you, including any data you have provided to us. You can also request that we erase any personal data we hold about you. This does not include any data we are obliged to keep for administrative, legal, or security purposes.
Where your data is sent
Suggested text: Visitor comments may be checked through an automated spam detection service.
Privacy Policydraftclosedopenprivacy-policy2024-01-19 10:43:332024-01-19 10:43:33http://127.0.0.1:8000/?page_id=3page
� ~ wcn� ~ � l 5���K��j2��k
+ 1require_name_email1yes #use_smilies1yes +use_balanceTags0yes 'start_of_week1yes& #3admin_emailadmin@localhost.comyes 1users_can_register0yes +
blogdescriptionyes$ 5blognameMy WordPress Websiteyes! 7homehttp://127.0.0.1:8000yes$ 7siteurlhttp://127.0.0.1:8000yes
� �lG ����g@���� d 1initial_db_version56657yes$c Cwp_attachment_pages_enabled0yes*b Ewp_force_deactivated_pluginsa:0:{}yes%a 9auto_update_core_majorenabledyes%` 9auto_update_core_minorenabledyes#_ 5auto_update_core_devenabledyes,^ Kauto_plugin_theme_update_emailsa:0:{}no$] Ccomment_previously_approved1yes\ +
disallowed_keysno&[ 5!admin_email_lifespan1721567346yes%Z Eshow_comments_cookies_opt_in1yes#Y Awp_page_for_privacy_policy3yesX 3medium_large_size_h0yesW 3medium_large_size_w768yes�Se '�wp_user_rolesa:5:{s:13:"administrator";a:2:{s:4:"name";s:13:"Administrator";s:12:"capabilities";a:61:{s:13:"switch_themes";b:1;s:11:"edit_themes";b:1;s:16:"activate_plugins";b:1;s:12:"edit_plugins";b:1;s:10:"edit_users";b:1;s:10:"edit_files";b:1;s:14:"manage_options";b:1;s:17:"moderate_comments";b:1;s:17:"manage_categories";b:1;s:12:"manage_links";b:1;s:12:"upload_files";b:1;s:6:"import";b:1;s:15:"unfiltered_html";b:1;s:10:"edit_posts";b:1;s:17:"edit_others_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:10:"edit_pages";b:1;s:4:"read";b:1;s:8:"level_10";b:1;s:7:"level_9";b:1;s:7:"level_8";b:1;s:7:"level_7";b:1;s:7:"level_6";b:1;s:7:"level_5";b:1;s:7:"level_4";b:1;s:7:"level_3";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:17:"edit_others_pages";b:1;s:20:"edit_published_pages";b:1;s:13:"publish_pages";b:1;s:12:"delete_pages";b:1;s:19:"delete_others_pages";b:1;s:22:"delete_published_pages";b:1;s:12:"delete_posts";b:1;s:19:"delete_others_posts";b:1;s:22:"delete_published_posts";b:1;s:20:"delete_private_posts";b:1;s:18:"edit_private_posts";b:1;s:18:"read_private_posts";b:1;s:20:"delete_private_pages";b:1;s:18:"edit_private_pages";b:1;s:18:"read_private_pages";b:1;s:12:"delete_users";b:1;s:12:"create_users";b:1;s:17:"unfiltered_upload";b:1;s:14:"edit_dashboard";b:1;s:14:"update_plugins";b:1;s:14:"delete_plugins";b:1;s:15:"install_plugins";b:1;s:13:"update_themes";b:1;s:14:"install_themes";b:1;s:11:"update_core";b:1;s:10:"list_users";b:1;s:12:"remove_users";b:1;s:13:"promote_users";b:1;s:18:"edit_theme_options";b:1;s:13:"delete_themes";b:1;s:6:"export";b:1;}}s:6:"editor";a:2:{s:4:"name";s:6:"Editor";s:12:"capabilities";a:34:{s:17:"moderate_comments";b:1;s:17:"manage_categories";b:1;s:12:"manage_links";b:1;s:12:"upload_files";b:1;s:15:"unfiltered_html";b:1;s:10:"edit_posts";b:1;s:17:"edit_others_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:10:"edit_pages";b:1;s:4:"read";b:1;s:7:"level_7";b:1;s:7:"level_6";b:1;s:7:"level_5";b:1;s:7:"level_4";b:1;s:7:"level_3";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:17:"edit_others_pages";b:1;s:20:"edit_published_pages";b:1;s:13:"publish_pages";b:1;s:12:"delete_pages";b:1;s:19:"delete_others_pages";b:1;s:22:"delete_published_pages";b:1;s:12:"delete_posts";b:1;s:19:"delete_others_posts";b:1;s:22:"delete_published_posts";b:1;s:20:"delete_private_posts";b:1;s:18:"edit_private_posts";b:1;s:18:"read_private_posts";b:1;s:20:"delete_private_pages";b:1;s:18:"edit_private_pages";b:1;s:18:"read_private_pages";b:1;}}s:6:"author";a:2:{s:4:"name";s:6:"Author";s:12:"capabilities";a:10:{s:12:"upload_files";b:1;s:10:"edit_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:4:"read";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:12:"delete_posts";b:1;s:22:"delete_published_posts";b:1;}}s:11:"contributor";a:2:{s:4:"name";s:11:"Contributor";s:12:"capabilities";a:5:{s:10:"edit_posts";b:1;s:4:"read";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:12:"delete_posts";b:1;}}s:10:"subscriber";a:2:{s:4:"name";s:10:"Subscriber";s:12:"capabilities";a:2:{s:4:"read";b:1;s:7:"level_0";b:1;}}}yes nd extract any location data from images on the website.Cookies
Suggested text: If you leave a comment on our site you may opt-in to saving your name, email address and website in cookies. These are for your convenience so that you do not have to fill in your details again when you leave another comment. These cookies will last for one year.
If you visit our login page, we will set a temporary cookie to determine if your browser accepts cookies. This cookie contains no personal data and is discarded when you close your browser.
When you log in, we will also set up several cookies to save your login information and your screen display choices. Login cookies last for two days, and screen options cookies last for a year. If you select "Remember Me", your login will persist for two weeks. If you log out of your account, the login cookies will be removed.
If you edit or publish an article, an additional cookie will be saved in your browser. This cookie includes no personal data and simply indicates the post ID of the article you just edited. It expires after 1 day.
Embedded content from other websites
Suggested text: Articles on this site may include embedded content (e.g. videos, images, articles, etc.). Embedded content from other websites behaves in the exact same way as if the visitor has visited the other website.
These websites may collect data about you, use cookies, embed additional third-party tracking, and monitor your interaction with that embedded content, including tracking your interaction with the embedded content if you have an account and are logged in to that website.
Who we share your data with
Suggested text: If you request a password reset, your IP address will be included in the reset email.
How long we retain your data
Suggested text: If you leave a comment, the comment and its metadata are retained indefinitely. This is so we can recognize and approve any follow-up comments automatically instead of holding them in a moderation queue.
For users that register on our website (if any), we also store the personal information they provide in their user profile. All users can see, edit, or delete their personal information at any time (except they cannot change their username). Website administrators can also see and edit that information.
What rights you have over your data
Suggested text: If you have an account on this site, or have left comments, you can request to receive an exported file of the personal data we hold about you, including any data you have provided to us. You can also request that we erase any personal data we hold about you. This does not include any data we are obliged to keep for administrative, legal, or security purposes.
Where your data is sent
Suggested text: Visitor comments may be checked through an automated spam detection service.
Privacy Policydraftclosedopenprivacy-policy2024-01-23 13:09:062024-01-23 13:09:06http://127.0.0.1:8000/?page_id=3page
� ~ wcn� ~ � l 5���K��j2��k
�
-| �jj �Gcrona:3:{i:1705661026;a:5:{s:32:"recovery_mode_clean_expired_keys";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:5:"daily";s:4:"args";a:0:{}s:8:"interval";i:86400;}}s:34:"wp_privacy_delete_old_export_files";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:6:"hourly";s:4:"args";a:0:{}s:8:"interval";i:3600;}}s:16:"wp_version_check";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:10:"twicedaily";s:4:"args";a:0:{}s:8:"interval";i:43200;}}s:17:"wp_update_plugins";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:10:"twicedaily";s:4:"args";a:0:{}s:8:"interval";i:43200;}}s:16:"wp_update_themes";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:10:"twicedaily";s:4:"args";a:0:{}s:8:"interval";i:43200;}}}i:1705747426;a:1:{s:30:"wp_site_health_scheduled_check";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:6:"weekly";s:4:"args";a:0:{}s:8:"interval";i:604800;}}}s:7:"version";i:2;}yes�Ky Q�M_transient_wp_core_block_css_filesa:2:{s:7:"version";s:5:"6.4.2";s:5:"files";a:125:{i:0;s:23:"archives/editor.min.css";i:1;s:22:"archives/style.min.css";i:2;s:20:"audio/editor.min.css";i:3;s:19:"audio/style.min.css";i:4;s:19:"audio/theme.min.css";i:5;s:21:"avatar/editor.min.css";i:6;s:20:"avatar/style.min.css";i:7;s:20:"block/editor.min.css";i:8;s:21:"button/editor.min.css";i:9;s:20:"button/style.min.css";i:10;s:22:"buttons/editor.min.css";i:11;s:21:"buttons/style.min.css";i:12;s:22:"calendar/style.min.css";i:13;s:25:"categories/editor.min.css";i:14;s:24:"categories/style.min.cs 88x 1Iwidget_custom_htmla:1:{s:12:"_multiwidget";i:1;}yes5w +Iwidget_nav_menua:1:{s:12:"_multiwidget";i:1;}yes6v -Iwidget_tag_clouda:1:{s:12:"_multiwidget";i:1;}yes